{"record":{"id":"6428e1185b2f96d4","repo":"nautechsystems/nautilus_trader","slug":"missing-price-component-in-label-level","errorCode":null,"errorMessage":"missing price component in {label} level","messagePattern":"missing price component in (.+?) level","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/adapters/bybit/src/common/parse.rs","lineNumber":961,"sourceCode":"    }\n\n    for level in &result.a {\n        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();","sourceCodeStart":943,"sourceCodeEnd":979,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/bybit/src/common/parse.rs#L943-L979","documentation":"parse_book_level expects each orderbook level to be a 2-element array [price, size]. This error means the level array was empty (or missing its first element), so there is no price string to parse into a Price. Bybit adapters throw it while converting a raw WebSocket orderbook delta/snapshot level into a Nautilus (Price, Quantity) pair.","triggerScenarios":"parse_orderbook receives a level entry that is an empty array or an array whose first element is absent (level.first() returns None).","commonSituations":"Malformed or truncated Bybit WebSocket payloads; exchange sending an empty level during snapshot->delta transitions; buggy custom middleware stripping fields; using an undocumented/changed message schema after a Bybit API version update.","solutions":["Inspect the raw WebSocket frame and fix/upgrade payload deserialization so each level is [price, size].","Guard in the caller: skip or log levels whose length != 2 before calling parse_book_level.","Check the Bybit adapter/nautilus version matches the exchange API version in use.","Log the full message id/context when this occurs and report to Bybit support if the exchange sends empty levels."],"exampleFix":"// before\nfor level in data.a { let (p, s) = parse_book_level(level, ...)?; ... }\n// after\nfor level in data.a {\n    if level.len() < 2 { log::warn!(\"skipping malformed level: {level:?}\"); continue; }\n    let (p, s) = parse_book_level(level, ...)?;\n}","handlingStrategy":"validation","validationCode":"// Rust: before consuming a parsed level\nfn level_is_valid(level: &[serde_json::Value]) -> bool { level.len() >= 2 && level[0].is_string() }","typeGuard":"fn as_book_level(level: &serde_json::Value) -> Option<(&str, &str)> {\n    let arr = level.as_array()?;\n    Some((arr.get(0)?.as_str()?, arr.get(1)?.as_str()?))\n}","tryCatchPattern":"match parse_book_level(level, pp, sp, \"bid\") {\n    Ok((price, size)) => apply(price, size),\n    Err(e) => log::warn!(\"skipping malformed level: {e:#}\"),\n}","preventionTips":["Validate level array length == 2 before parsing","Pin the Bybit adapter version to the exchange API version you target","Log raw frames at debug level so malformed messages are diagnosable"],"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"}