{"record":{"id":"30efc175d8b3bce5","repo":"nautechsystems/nautilus_trader","slug":"missing-size-component-in-label-level","errorCode":null,"errorMessage":"missing size component in {label} level","messagePattern":"missing size component in (.+?) level","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/adapters/bybit/src/common/parse.rs","lineNumber":964,"sourceCode":"        push_level(level, OrderSide::Sell)?;\n    }\n\n    OrderBookDeltas::new_checked(instrument_id, deltas)\n        .context(\"failed to assemble OrderBookDeltas from Bybit message\")\n}\n\npub fn parse_book_level(\n    level: &[String],\n    price_precision: u8,\n    size_precision: u8,\n    label: &str,\n) -> anyhow::Result<(Price, Quantity)> {\n    let price_str = level\n        .first()\n        .ok_or_else(|| anyhow::anyhow!(\"missing price component in {label} level\"))?;\n    let size_str = level\n        .get(1)\n        .ok_or_else(|| anyhow::anyhow!(\"missing size component in {label} level\"))?;\n    let price = parse_price_with_precision(price_str, price_precision, label)?;\n    let size = parse_quantity_with_precision(size_str, size_precision, label)?;\n    Ok((price, size))\n}\n\n/// Parses a kline entry into a [`Bar`].\npub fn parse_kline_bar(\n    kline: &BybitKline,\n    instrument: &InstrumentAny,\n    bar_type: BarType,\n    timestamp_on_close: bool,\n    ts_init: Option<UnixNanos>,\n) -> anyhow::Result<Bar> {\n    let price_precision = instrument.price_precision();\n    let size_precision = instrument.size_precision();\n\n    let open = parse_price_with_precision(&kline.open, price_precision, \"kline.open\")?;\n    let high = parse_price_with_precision(&kline.high, price_precision, \"kline.high\")?;","sourceCodeStart":946,"sourceCodeEnd":982,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/bybit/src/common/parse.rs#L946-L982","documentation":"parse_book_level expects a 2-element array [price, size] per orderbook level. This error means the price element existed but the size element (index 1) was missing, so the level cannot be converted into a Quantity. Thrown by the Bybit adapter while building orderbook deltas.","triggerScenarios":"parse_orderbook passes a level array with exactly one element (level.get(1) returns None) to parse_book_level.","commonSituations":"Partial/truncated WebSocket updates; a custom transformer emitting only prices; schema drift from a Bybit API version change where size fields moved or were dropped.","solutions":["Inspect the raw frame and ensure each level contains both price and size elements.","Validate level.len() == 2 in the caller before parsing; skip/log malformed entries.","Update the adapter or Bybit API version alignment if the message schema changed."],"exampleFix":"// before\nlet (p, s) = parse_book_level(level, price_precision, size_precision, \"bid\")?;\n// after\nif level.len() != 2 { anyhow::bail!(\"expected [price,size], got {level:?}\"); }\nlet (p, s) = parse_book_level(level, price_precision, size_precision, \"bid\")?;","handlingStrategy":"validation","validationCode":"// Rust: skip levels lacking a size component\nif level.len() != 2 { log::warn!(\"malformed level: {level:?}\"); continue; }","typeGuard":"fn has_price_and_size(level: &[serde_json::Value]) -> bool {\n    level.len() == 2 && level.iter().all(|v| v.is_string())\n}","tryCatchPattern":"let (price, size) = parse_book_level(level, pp, sp, label)\n    .inspect_err(|e| log::warn!(\"dropping {label} level: {e:#}\"))?;","preventionTips":["Assert snapshot and delta levels always carry both price and size","Keep deserialization schemas in sync with Bybit API changelog","Test the orderbook parser against recorded real exchange frames"],"tags":["orderbook","parsing","websocket","bybit"],"backgroundTag":"index-out-of-range","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"}