{"record":{"id":"2e69a2efd13d8372","repo":"nautechsystems/nautilus_trader","slug":"price-not-set","errorCode":null,"errorMessage":"Price not set","messagePattern":"Price not set","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/model/src/orders/builder.rs","lineNumber":196,"sourceCode":"\n    // ----------- Quantity ----------\n    pub fn quantity(&mut self, quantity: Quantity) -> &mut Self {\n        self.quantity = Some(quantity);\n        self\n    }\n\n    fn get_quantity(&self) -> Quantity {\n        self.quantity.expect(\"Order quantity not set\")\n    }\n\n    // ----------- Price ----------\n    pub fn price(&mut self, price: Price) -> &mut Self {\n        self.price = Some(price);\n        self\n    }\n\n    fn get_price(&self) -> Price {\n        self.price.expect(\"Price not set\")\n    }\n\n    // ----------- TriggerPrice ----------\n    pub fn trigger_price(&mut self, trigger_price: Price) -> &mut Self {\n        self.trigger_price = Some(trigger_price);\n        self\n    }\n\n    fn get_trigger_price(&self) -> Price {\n        self.trigger_price.expect(\"Trigger price not set\")\n    }\n\n    // ----------- ActivationPrice ----------\n    pub fn activation_price(&mut self, activation_price: Price) -> &mut Self {\n        self.activation_price = Some(activation_price);\n        self\n    }\n","sourceCodeStart":178,"sourceCodeEnd":214,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/model/src/orders/builder.rs#L178-L214","documentation":"A builder-invariant panic via Option::expect: OrderBuilder::build was invoked without price() having been called, so the required Price field is None. It indicates programmer error — an incomplete order definition — not a recoverable runtime condition; callers must set price before build.","triggerScenarios":"Building a Limit/StopLimit/TrailingStopLimit order via OrderTestBuilder without chaining .price(Price) before build().","commonSituations":"Converting a market-order test builder to a limit order without adding the price line, or a parametrized test where the price branch was not supplied.","solutions":["Add .price(Price::from(...)) to the builder chain before build().","Only omit .price for price-less order types (Market).","Use a fixture function that builds priced orders with sensible defaults."],"exampleFix":"// before\nlet order = OrderTestBuilder::new(OrderType::Limit).instrument_id(id).quantity(qty).build();\n// after\nlet order = OrderTestBuilder::new(OrderType::Limit)\n    .instrument_id(id)\n    .quantity(qty)\n    .price(Price::from(\"50000.00\"))\n    .build();","handlingStrategy":"validation","validationCode":"if matches!(order_type, OrderType::Limit | OrderType::StopLimit | OrderType::TrailingStopLimit | OrderType::MarketToLimit) {\n    assert!(price.is_some(), \"price required for {:?}\", order_type);\n}\nbuilder.price(price.unwrap()).build();","typeGuard":"fn order_type_needs_price(t: OrderType) -> bool {\n    matches!(t, OrderType::Limit | OrderType::StopLimit | OrderType::TrailingStopLimit | OrderType::MarketToLimit)\n}","tryCatchPattern":"// check order type before build\nassert!(price.is_some() || !order_type_needs_price(order_type));","preventionTips":["Add .price(...) whenever the order type is price-bearing.","Keep market-order and limit-order builder snippets in separate fixtures.","Assert required optional fields in parametrized tests before calling build()."],"tags":["rust","panic","builder","missing-field","testing"],"backgroundTag":"missing-required-argument","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"}