{"record":{"id":"40c3c94da4ad2363","repo":"nautechsystems/nautilus_trader","slug":"no-symbols-provided-40c3c9","errorCode":null,"errorMessage":"No symbols provided","messagePattern":"No symbols provided","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/adapters/databento/src/historical.rs","lineNumber":282,"sourceCode":"        })\n    }\n\n    /// Fetches instrument definitions for the given parameters.\n    ///\n    /// # Errors\n    ///\n    /// Returns an error if the API request or data processing fails.\n    pub async fn get_range_instruments(\n        &self,\n        params: RangeQueryParams,\n    ) -> anyhow::Result<Vec<InstrumentAny>> {\n        let symbols: Vec<&str> = params.symbols.iter().map(String::as_str).collect();\n        check_consistent_symbology(&symbols)?;\n\n        let first_symbol = params\n            .symbols\n            .first()\n            .ok_or_else(|| anyhow::anyhow!(\"No symbols provided\"))?;\n        let stype_in = infer_symbology_type(first_symbol);\n        let end = params.end.unwrap_or_else(|| self.clock.get_time_ns());\n        let time_range = get_date_time_range(params.start, end)?;\n\n        let range_params = GetRangeParams::builder()\n            .dataset(params.dataset)\n            .date_time_range(time_range)\n            .symbols(symbols)\n            .stype_in(stype_in)\n            .schema(dbn::Schema::Definition)\n            .maybe_limit(params.limit.and_then(NonZeroU64::new))\n            .build();\n\n        let mut client = (*self.inner).clone();\n        let mut decoder = client\n            .timeseries()\n            .get_range(&range_params)\n            .await","sourceCodeStart":264,"sourceCodeEnd":300,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/databento/src/historical.rs#L264-L300","documentation":"Guard in `get_range_instruments`: the request parameters contain an empty `symbols` list, so there is no first symbol from which to infer symbology type. The adapter refuses to issue a request that Databento would reject anyway.","triggerScenarios":"Calling `get_range_instruments` with params whose `symbols: Vec<String>` is empty.","commonSituations":"Building params programmatically from a filtered/empty collection, or a config file where the symbols list was left blank.","solutions":["Provide at least one symbol in params.symbols","Guard the call site: return early if the symbol list is empty before constructing params","Fix the upstream code that produced an empty filter list","If 'all symbols' is intended, use the Databento wildcard symbol ('ALL_SYMBOLS') if supported for your request type"],"exampleFix":"// before\nlet params = GetRangeParamsBuilder::default().symbols(vec![]).build()?;\nclient.get_range_instruments(params).await?;\n// after\nlet symbols = vec![\"ESZ5\".to_string()];\nassert!(!symbols.is_empty());\nlet params = GetRangeParamsBuilder::default().symbols(symbols).build()?;\nclient.get_range_instruments(params).await?;","handlingStrategy":"validation","validationCode":"if params.symbols.is_empty() {\n    bail!(\"get_range_instruments requires at least one symbol\");\n}","typeGuard":"fn has_symbols(symbols: &[String]) -> bool { !symbols.is_empty() }","tryCatchPattern":null,"preventionTips":["Check symbol lists for emptiness before building request params","Trace why the upstream filter produced zero symbols","Avoid silently passing user-supplied empty lists to the adapter","Add a unit test for empty-symbol param construction"],"tags":["rust","databento","empty-input","validation"],"backgroundTag":"empty-required-field","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"}