{"record":{"id":"8469eaa76ef5c712","repo":"nautechsystems/nautilus_trader","slug":"invalid-orderside","errorCode":null,"errorMessage":"Invalid `OrderSide`","messagePattern":"Invalid `OrderSide`","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"critical","filePath":"crates/infrastructure/src/sql/models/orders.rs","lineNumber":1061,"sourceCode":"            .and_then(|x| x.map(VenueOrderId::from));\n        let position_id = row\n            .try_get::<Option<&str>, _>(\"position_id\")\n            .ok()\n            .and_then(|x| x.map(PositionId::from));\n        let account_id = row\n            .try_get::<Option<&str>, _>(\"account_id\")\n            .ok()\n            .and_then(|x| x.map(AccountId::from));\n        let last_trade_id = row\n            .try_get::<Option<&str>, _>(\"last_trade_id\")\n            .ok()\n            .and_then(|x| x.map(TradeId::from));\n        let order_type = row\n            .try_get::<&str, _>(\"order_type\")\n            .map(|x| OrderType::from_str(x).expect(\"Invalid `OrderType`\"))?;\n        let order_side = row\n            .try_get::<&str, _>(\"order_side\")\n            .map(|x| OrderSide::from_str(x).expect(\"Invalid `OrderSide`\"))?;\n        let quantity = row.try_get::<&str, _>(\"quantity\").map(Quantity::from)?;\n        let price = row\n            .try_get::<Option<&str>, _>(\"price\")\n            .ok()\n            .and_then(|x| x.map(Price::from));\n        let activation_price = row\n            .try_get::<Option<&str>, _>(\"activation_price\")\n            .ok()\n            .and_then(|x| x.map(Price::from));\n        let trigger_price = row\n            .try_get::<Option<&str>, _>(\"trigger_price\")\n            .ok()\n            .and_then(|x| x.map(Price::from));\n        let trigger_type = row\n            .try_get::<Option<&str>, _>(\"trigger_type\")\n            .ok()\n            .and_then(parse_trigger_type);\n        let limit_offset = row","sourceCodeStart":1043,"sourceCodeEnd":1079,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/infrastructure/src/sql/models/orders.rs#L1043-L1079","documentation":"Same row-hydration pattern as order_type: the `order_side` column string is parsed with `OrderSide::from_str` and unwrapped with expect(). The panic means the stored side string (expected values like 'BUY'/'SELL') is unrecognized, so the order row cannot be deserialized.","triggerScenarios":"Calling `OrderModel::from_row` where `order_side` holds values like 'buy' (wrong case), 'B'/'S', a localized string, or data from a foreign schema.","commonSituations":"Tables shared with non-nautilus writers; case-sensitivity mismatches after manual data loads; adapters persisting their own side naming.","solutions":["Find and fix bad rows: `SELECT id, order_side FROM orders WHERE order_side NOT IN ('BUY','SELL')`","Normalize the writer to persist canonical 'BUY'/'SELL' strings","If case is the only problem, normalize with UPPER() in a data migration","Propagate a parse error instead of expect when handling untrusted data"],"exampleFix":"// before\nOrderSide::from_str(x).expect(\"Invalid `OrderSide`\")\n// after\nOrderSide::from_str(&x.to_uppercase()).map_err(|_| ModelError::Parse(format!(\"bad order_side '{x}'\")))?","handlingStrategy":"type-guard","validationCode":"assert!(matches!(order_side_str, \"BUY\" | \"SELL\"), \"bad order_side: {order_side_str}\");","typeGuard":"fn is_known_order_side(s: &str) -> bool {\n    OrderSide::from_str(s).is_ok()\n}","tryCatchPattern":"let order_side = OrderSide::from_str(x)\n    .map_err(|e| ModelError::Parse(format!(\"row {}: invalid order_side '{x}': {e}\", row_id)))?;","preventionTips":["Normalize side strings (trim/uppercase) before persisting","Add a DB CHECK constraint order_side IN ('BUY','SELL')","Avoid sharing order tables with non-nautilus writers","Test round-trip persistence of every OrderSide variant"],"tags":["rust","sql","postgres","enum","panic"],"backgroundTag":"invalid-enum-value","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"}