{"record":{"id":"8597d92ec5b53c6d","repo":"nautechsystems/nautilus_trader","slug":"invalid-config-type-for-betfairdataclientfactory-8597d9","errorCode":null,"errorMessage":"Invalid config type for BetfairDataClientFactory. Expected BetfairDataClientConfig, was {config:?}","messagePattern":"Invalid config type for BetfairDataClientFactory\\. Expected BetfairDataClientConfig, was (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/adapters/betfair/src/factories.rs","lineNumber":78,"sourceCode":"impl Default for BetfairDataClientFactory {\n    fn default() -> Self {\n        Self::new()\n    }\n}\n\nimpl DataClientFactory for BetfairDataClientFactory {\n    fn create(\n        &self,\n        name: &str,\n        config: &dyn ClientConfig,\n        _cache: CacheView,\n        _clock: Rc<RefCell<dyn Clock>>,\n    ) -> anyhow::Result<Box<dyn DataClient>> {\n        let betfair_config = config\n            .as_any()\n            .downcast_ref::<BetfairDataClientConfig>()\n            .ok_or_else(|| {\n                anyhow::anyhow!(\n                    \"Invalid config type for BetfairDataClientFactory. Expected BetfairDataClientConfig, was {config:?}\",\n                )\n            })?\n            .clone();\n\n        betfair_config.validate()?;\n\n        let credential = betfair_config.credential()?;\n        let stream_config = betfair_config.stream_config();\n        let nav_filter = betfair_config.navigation_filter();\n        let currency = betfair_config.currency()?;\n        let min_notional = betfair_config.min_notional()?;\n\n        let http_client = BetfairHttpClient::new(\n            credential.clone(),\n            None,\n            None,\n            None,","sourceCodeStart":60,"sourceCodeEnd":96,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/betfair/src/factories.rs#L60-L96","documentation":"BetfairDataClientFactory.create accepts any ClientConfig but only works with BetfairDataClientConfig. It downcasts the passed config; if the downcast fails it throws this error naming the expected and actual config types. Passing a config built for a different venue or client class triggers it.","triggerScenarios":"Calling BetfairDataClientFactory.create with a config that is not BetfairDataClientConfig — e.g. a BetfairExecutionClientConfig, another venue's DataClientConfig, or a generic config.","commonSituations":"Mixing up data vs execution config types when wiring clients in a node/script; copy-pasted factory registration with the wrong config class; dynamic config loading that yields the wrong concrete type.","solutions":["Construct the config as BetfairDataClientConfig for this factory.","Check the factory registration/lookup so each factory receives its matching config type.","If loading configs dynamically, verify the config's concrete type before calling create."],"exampleFix":"// before\nconfig = BetfairExecutionClientConfig(...)\nclient = BetfairDataClientFactory().create(..., config, ...)\n\n// after\nconfig = BetfairDataClientConfig(name=..., venue=..., api_key=..., username=..., password=...)\nclient = BetfairDataClientFactory().create(..., config, ...)","handlingStrategy":"type-guard","validationCode":"if not isinstance(config, BetfairDataClientConfig):\n    raise TypeError(f\"BetfairDataClientFactory requires BetfairDataClientConfig, got {type(config).__name__}\")","typeGuard":"fn is_betfair_data_config(config: &dyn ClientConfig) -> bool {\n    config.as_any().downcast_ref::<BetfairDataClientConfig>().is_some()\n}","tryCatchPattern":"match factory.create(beneficiary, None, config, cache, clock) {\n    Ok(client) => client,\n    Err(e) if e.to_string().contains(\"Invalid config type\") => {\n        panic!(\"wiring bug: wrong config for BetfairDataClientFactory: {e}\")\n    }\n    Err(e) => return Err(e),\n}","preventionTips":["Pair each factory with exactly its config type when registering.","Use typed builders so the compiler enforces config/factory matching.","Add a startup check that all node configs downcast to their factory's expected type."],"tags":["factory","config-type","downcast"],"backgroundTag":"config-type-mismatch","analyzedSha":"18893faf8b356be3320add8de2f861b0b647cf06","analyzedAt":"2026-09-08T20:49:34.690Z","contentChangedAt":"2026-09-08T20:49:34.690Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}