{"record":{"id":"89c36f96315037e6","repo":"nautechsystems/nautilus_trader","slug":"continuous-future-bar-subscriptions-must-not-inclu","errorCode":null,"errorMessage":"Continuous future bar subscriptions must not include `bar_types`; pass the chain in continuous_future_transitions instead","messagePattern":"Continuous future bar subscriptions must not include `bar_types`; pass the chain in continuous_future_transitions instead","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/data/src/engine/requests.rs","lineNumber":358,"sourceCode":"    }\n\n    let bar_types = continuous_future_bar_types(request, params)?;\n    parse_continuous_future(bar_types, params).map(Some)\n}\n\npub(super) fn continuous_future_subscription_from_bars(\n    cmd: &SubscribeBars,\n) -> anyhow::Result<Option<ContinuousFutureRequest>> {\n    let Some(params) = cmd.params.as_ref() else {\n        return Ok(None);\n    };\n\n    if !params.contains_key(CONTINUOUS_FUTURE_TRANSITIONS) {\n        return Ok(None);\n    }\n\n    if params.contains_key(BAR_TYPES) {\n        anyhow::bail!(\n            \"Continuous future bar subscriptions must not include `bar_types`; pass the chain in continuous_future_transitions instead\"\n        );\n    }\n\n    parse_continuous_future(vec![cmd.bar_type], params).map(Some)\n}\n\nfn parse_continuous_future(\n    bar_types: Vec<BarType>,\n    params: &Params,\n) -> anyhow::Result<ContinuousFutureRequest> {\n    let primary_bar_type = bar_types[0];\n    if !primary_bar_type.is_internally_aggregated() {\n        anyhow::bail!(\"Continuous future target {primary_bar_type} must be internally aggregated\");\n    }\n\n    let transitions_value = params\n        .get(CONTINUOUS_FUTURE_TRANSITIONS)","sourceCodeStart":340,"sourceCodeEnd":376,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/data/src/engine/requests.rs#L340-L376","documentation":"When subscribing to continuous future bars via the continuous_future_transitions param, the chain of contracts must be passed only in that param. Including a separate bar_types param is ambiguous (two sources of the chain), so the engine rejects the subscription to prevent conflicting definitions.","triggerScenarios":"Calling subscribe_continuous_future_bars (with continuous_future_transitions present in params) while the params also contain the BAR_TYPES key — e.g. merging generic bar subscription params with continuous-future params.","commonSituations":"Copy-pasting a normal bars subscription call (which sets bar_types) and adding continuous_future_transitions; a generic param builder that always injects bar_types.","solutions":["Remove the bar_types key from params when continuous_future_transitions is supplied; the primary bar type comes from cmd.bar_type.","Pass the full contract chain exclusively via continuous_future_transitions.","Ensure your param builder only sets one of the two for continuous future subscriptions."],"exampleFix":"// before\nlet params = params_with(BAR_TYPES, chain).with(CONTINUOUS_FUTURE_TRANSITIONS, transitions);\n// after\nlet params = params_with(CONTINUOUS_FUTURE_TRANSITIONS, transitions); // no BAR_TYPES","handlingStrategy":"validation","validationCode":"if params.contains_key(CONTINUOUS_FUTURE_TRANSITIONS) && params.contains_key(BAR_TYPES) {\n    anyhow::bail!(\"remove BAR_TYPES when CONTINUOUS_FUTURE_TRANSITIONS is set\");\n}","typeGuard":null,"tryCatchPattern":"match engine.subscribe_continuous_future_bars(&cmd) {\n    Err(e) if e.to_string().contains(\"must not include `bar_types`\") => {\n        let mut p = params.clone();\n        p.remove(BAR_TYPES);\n        let cmd = SubscribeBars { params: p, ..cmd };\n        engine.subscribe_continuous_future_bars(&cmd)?;\n    }\n    r => r?,\n}","preventionTips":["Pass the contract chain only via continuous_future_transitions","Don't reuse generic bars-subscription param builders for continuous futures","Add an assertion that BAR_TYPES is absent when building continuous future params"],"tags":["rust","data-engine","futures","conflicting-params"],"backgroundTag":"mutually-exclusive-options","analyzedSha":"18893faf8b356be3320add8de2f861b0b647cf06","analyzedAt":"2026-09-08T20:49:34.690Z","contentChangedAt":"2026-09-08T20:49:34.690Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}