{"record":{"id":"5194e1b7590018ce","repo":"nautechsystems/nautilus_trader","slug":"invalid-positionside","errorCode":null,"errorMessage":"Invalid `PositionSide`","messagePattern":"Invalid `PositionSide`","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/infrastructure/src/sql/models/positions.rs","lineNumber":57,"sourceCode":"        let instrument_id = row\n            .try_get::<&str, _>(\"instrument_id\")\n            .map(InstrumentId::from)?;\n        let account_id = row.try_get::<&str, _>(\"account_id\").map(AccountId::from)?;\n        let opening_order_id = row\n            .try_get::<&str, _>(\"opening_order_id\")\n            .map(ClientOrderId::from)?;\n        let closing_order_id = row\n            .try_get::<Option<&str>, _>(\"closing_order_id\")\n            .ok()\n            .and_then(|x| x.map(ClientOrderId::from));\n        let entry = row\n            .try_get::<&str, _>(\"entry\")\n            .map(OrderSide::from_str)?\n            .expect(\"Invalid `OrderSide`\");\n        let side = row\n            .try_get::<&str, _>(\"side\")\n            .map(PositionSide::from_str)?\n            .expect(\"Invalid `PositionSide`\");\n        let signed_qty = row.try_get::<f64, _>(\"signed_qty\")?;\n        let quantity = row.try_get::<&str, _>(\"quantity\").map(Quantity::from)?;\n        let peak_qty = row.try_get::<&str, _>(\"peak_qty\").map(Quantity::from)?;\n        let quote_currency = row\n            .try_get::<&str, _>(\"quote_currency\")\n            .map(Currency::from)?;\n        let base_currency = row\n            .try_get::<Option<&str>, _>(\"base_currency\")\n            .ok()\n            .and_then(|x| x.map(Currency::from));\n        let settlement_currency = row\n            .try_get::<&str, _>(\"settlement_currency\")\n            .map(Currency::from)?;\n        let avg_px_open = row.try_get::<f64, _>(\"avg_px_open\")?;\n        let avg_px_close = row.try_get::<Option<f64>, _>(\"avg_px_close\")?;\n        let realized_return = row.try_get::<Option<f64>, _>(\"realized_return\")?;\n        let realized_pnl = row.try_get::<&str, _>(\"realized_pnl\").map(Money::from)?;\n        let unrealized_pnl = row","sourceCodeStart":39,"sourceCodeEnd":75,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/infrastructure/src/sql/models/positions.rs#L39-L75","documentation":"`AccountPosition::from_row` parses the `side` column as a `PositionSide` via `PositionSide::from_str` and unwraps with `.expect(\"Invalid `PositionSide`\")`. A `side` value that is not a valid `PositionSide` variant ('LONG', 'SHORT', 'FLAT') causes the row deserialization to panic. This is a defensive guard against corrupted or foreign-written rows.","triggerScenarios":"Reading a `positions` row whose `side` column contains an unrecognized string (e.g. empty, lowercase 'long', 'LONG_POSITION'), typically from manual inserts, ETL imports, or a schema/version mismatch between writer and reader.","commonSituations":"Manual data fixes on the positions table; importing positions from another system with different side naming; backup restores across nautilus versions with changed enum values.","solutions":["Inspect the `side` value of the failing row and rewrite it as a valid `PositionSide` ('LONG', 'SHORT', or 'FLAT')","Run `SELECT DISTINCT side FROM positions` and validate each value against `PositionSide::from_str`","Fix the writer/adapter that produced the non-canonical string so it uses the library serializer","Rebuild affected rows from underlying order/fill events if source data is available"],"exampleFix":"// before\nside = 'long'\n// after\nside = 'LONG'","handlingStrategy":"validation","validationCode":"fn valid_position_side(s: &str) -> bool { PositionSide::from_str(s).is_some() }\n// check before persisting or accepting positions rows","typeGuard":"fn parse_position_side(s: &str) -> Option<PositionSide> { PositionSide::from_str(s) }","tryCatchPattern":null,"preventionTips":["Persist only canonical 'LONG'/'SHORT'/'FLAT' strings","Validate imported/foreign data against the enum before insert","Avoid manual edits on the positions table; rebuild from events"],"tags":["database","parsing","panic","enum"],"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-14T00:17:10.932Z"}