{"record":{"id":"16e7a74efb087c47","repo":"nautechsystems/nautilus_trader","slug":"no-symbols-provided","errorCode":null,"errorMessage":"No symbols provided","messagePattern":"No symbols provided","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/adapters/databento/src/symbology.rs","lineNumber":180,"sourceCode":"\n    let parts: Vec<&str> = symbol.split('.').collect();\n    if parts.len() == 3 && parts[2].chars().all(|c| c.is_ascii_digit()) {\n        return SType::Continuous;\n    }\n\n    if symbol.chars().all(|c| c.is_ascii_digit()) {\n        return SType::InstrumentId;\n    }\n\n    SType::RawSymbol\n}\n\n/// # Errors\n///\n/// Returns an error if `symbols` is empty or symbols have inconsistent symbology types.\npub fn check_consistent_symbology(symbols: &[&str]) -> anyhow::Result<()> {\n    if symbols.is_empty() {\n        anyhow::bail!(\"No symbols provided\");\n    }\n    let first_symbol = symbols[0];\n    let first_stype = infer_symbology_type(first_symbol);\n\n    for symbol in symbols {\n        let next_stype = infer_symbology_type(symbol);\n        if next_stype != first_stype {\n            anyhow::bail!(\n                \"Inconsistent symbology types: '{first_stype}' for {first_symbol} vs '{next_stype}' for {symbol}\"\n            );\n        }\n    }\n\n    Ok(())\n}\n\n#[cfg(test)]\nmod tests {","sourceCodeStart":162,"sourceCodeEnd":198,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/databento/src/symbology.rs#L162-L198","documentation":"check_consistent_symbology validates that the caller supplied a non-empty list of symbols before issuing Databento range requests. An empty slice cannot form a valid symbology request, so it errors immediately.","triggerScenarios":"Calling any get_range_* function (instruments, quotes, order book depth10/deltas, trades, bars) with an empty symbols slice.","commonSituations":"Programmatically built symbol lists that end up empty (filtered-out instruments, failed symbol resolution), passing a default-constructed Vec.","solutions":["Ensure the symbol list is non-empty before calling get_range_*","Check upstream symbol resolution logic for filters that can remove all symbols","Guard the call site with an explicit emptiness check"],"exampleFix":"// before\nadapter.get_range_trades(&[], stype).await?;\n// after\nif symbols.is_empty() {\n    anyhow::bail!(\"cannot request trades: no symbols\");\n}\nadapter.get_range_trades(&symbols, stype).await?;","handlingStrategy":"validation","validationCode":"if symbols.is_empty() {\n    anyhow::bail!(\"refusing request: symbol list is empty\");\n}","typeGuard":"fn has_symbols(symbols: &[&str]) -> bool { !symbols.is_empty() }","tryCatchPattern":"match check_consistent_symbology(&symbols) {\n    Err(e) if e.to_string().contains(\"No symbols provided\") => {\n        warn!(\"nothing to request\");\n    }\n    other => other?,\n}","preventionTips":["Validate symbol lists at config load time","Beware filters that can silently empty the symbol list","Fail fast with a clear message upstream of get_range_*"],"tags":["databento","validation","empty-input","symbols"],"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"}