Skip to content

Commit beffe7b

Browse files
committed
Standardize order construction and PyResult for pyo3
1 parent 2d738ab commit beffe7b

File tree

13 files changed

+126
-114
lines changed

13 files changed

+126
-114
lines changed

crates/execution/src/order_emulator/emulator.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -792,7 +792,7 @@ impl OrderEmulator {
792792
let emulation_trigger = TriggerType::NoTrigger;
793793

794794
// Transform order
795-
let mut transformed = if let Ok(transformed) = LimitOrder::new(
795+
let mut transformed = if let Ok(transformed) = LimitOrder::new_checked(
796796
order.trader_id(),
797797
order.strategy_id(),
798798
order.instrument_id(),

crates/model/src/orders/builder.rs

Lines changed: 28 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
#![allow(dead_code)]
1818

1919
use indexmap::IndexMap;
20-
use nautilus_core::{UUID4, UnixNanos, correctness::FAILED};
20+
use nautilus_core::{UUID4, UnixNanos};
2121
use rust_decimal::Decimal;
2222
use ustr::Ustr;
2323

@@ -510,36 +510,33 @@ impl OrderTestBuilder {
510510
self.get_exec_spawn_id(),
511511
self.get_tags(),
512512
)),
513-
OrderType::Limit => OrderAny::Limit(
514-
LimitOrder::new(
515-
self.get_trader_id(),
516-
self.get_strategy_id(),
517-
self.get_instrument_id(),
518-
self.get_client_order_id(),
519-
self.get_side(),
520-
self.get_quantity(),
521-
self.get_price(),
522-
self.get_time_in_force(),
523-
self.get_expire_time(),
524-
self.get_post_only(),
525-
self.get_reduce_only(),
526-
self.get_quote_quantity(),
527-
self.get_display_qty(),
528-
self.get_emulation_trigger(),
529-
self.get_trigger_instrument_id(),
530-
self.get_contingency_type(),
531-
self.get_order_list_id(),
532-
self.get_linked_order_ids(),
533-
self.get_parent_order_id(),
534-
self.get_exec_algorithm_id(),
535-
self.get_exec_algorithm_params(),
536-
self.get_exec_spawn_id(),
537-
self.get_tags(),
538-
self.get_init_id(),
539-
self.get_ts_init(),
540-
)
541-
.expect(FAILED),
542-
),
513+
OrderType::Limit => OrderAny::Limit(LimitOrder::new(
514+
self.get_trader_id(),
515+
self.get_strategy_id(),
516+
self.get_instrument_id(),
517+
self.get_client_order_id(),
518+
self.get_side(),
519+
self.get_quantity(),
520+
self.get_price(),
521+
self.get_time_in_force(),
522+
self.get_expire_time(),
523+
self.get_post_only(),
524+
self.get_reduce_only(),
525+
self.get_quote_quantity(),
526+
self.get_display_qty(),
527+
self.get_emulation_trigger(),
528+
self.get_trigger_instrument_id(),
529+
self.get_contingency_type(),
530+
self.get_order_list_id(),
531+
self.get_linked_order_ids(),
532+
self.get_parent_order_id(),
533+
self.get_exec_algorithm_id(),
534+
self.get_exec_algorithm_params(),
535+
self.get_exec_spawn_id(),
536+
self.get_tags(),
537+
self.get_init_id(),
538+
self.get_ts_init(),
539+
)),
543540
OrderType::StopMarket => OrderAny::StopMarket(StopMarketOrder::new(
544541
self.get_trader_id(),
545542
self.get_strategy_id(),

crates/model/src/orders/default.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ impl Default for LimitOrder {
5858
UUID4::default(),
5959
UnixNanos::default(),
6060
)
61-
.unwrap() // SAFETY: Valid default values are used
6261
}
6362
}
6463

crates/model/src/orders/limit.rs

Lines changed: 38 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use std::{
1919
};
2020

2121
use indexmap::IndexMap;
22-
use nautilus_core::{UUID4, UnixNanos};
22+
use nautilus_core::{UUID4, UnixNanos, correctness::FAILED};
2323
use rust_decimal::Decimal;
2424
use serde::{Deserialize, Serialize};
2525
use ustr::Ustr;
@@ -90,19 +90,33 @@ impl LimitOrder {
9090
init_id: UUID4,
9191
ts_init: UnixNanos,
9292
) -> anyhow::Result<Self> {
93-
Self::new(
93+
check_positive_quantity(quantity, stringify!(quantity))?;
94+
check_display_qty(display_qty, quantity)?;
95+
check_time_in_force(time_in_force, expire_time)?;
96+
97+
let init_order = OrderInitialized::new(
9498
trader_id,
9599
strategy_id,
96100
instrument_id,
97101
client_order_id,
98102
order_side,
103+
OrderType::Limit,
99104
quantity,
100-
price,
101105
time_in_force,
102-
expire_time,
103106
post_only,
104107
reduce_only,
105108
quote_quantity,
109+
false,
110+
init_id,
111+
ts_init, // ts_event timestamp identical to ts_init
112+
ts_init,
113+
Some(price),
114+
None,
115+
None,
116+
None,
117+
None,
118+
None,
119+
expire_time,
106120
display_qty,
107121
emulation_trigger,
108122
trigger_instrument_id,
@@ -114,16 +128,23 @@ impl LimitOrder {
114128
exec_algorithm_params,
115129
exec_spawn_id,
116130
tags,
117-
init_id,
118-
ts_init,
119-
)
131+
);
132+
133+
Ok(Self {
134+
core: OrderCore::new(init_order),
135+
price,
136+
expire_time: expire_time.or(Some(UnixNanos::default())),
137+
is_post_only: post_only,
138+
display_qty,
139+
trigger_instrument_id,
140+
})
120141
}
121142

122143
/// Creates a new [`LimitOrder`] instance.
123144
///
124-
/// # Errors
145+
/// # Panics
125146
///
126-
/// Errors if any order validation fails (see [`LimitOrder::new_checked`]).
147+
/// Panics if any order validation fails (see [`LimitOrder::new_checked`]).
127148
#[allow(clippy::too_many_arguments)]
128149
pub fn new(
129150
trader_id: TraderId,
@@ -151,34 +172,20 @@ impl LimitOrder {
151172
tags: Option<Vec<Ustr>>,
152173
init_id: UUID4,
153174
ts_init: UnixNanos,
154-
) -> anyhow::Result<Self> {
155-
check_positive_quantity(quantity, stringify!(quantity))?;
156-
check_display_qty(display_qty, quantity)?;
157-
check_time_in_force(time_in_force, expire_time)?;
158-
159-
let init_order = OrderInitialized::new(
175+
) -> Self {
176+
Self::new_checked(
160177
trader_id,
161178
strategy_id,
162179
instrument_id,
163180
client_order_id,
164181
order_side,
165-
OrderType::Limit,
166182
quantity,
183+
price,
167184
time_in_force,
185+
expire_time,
168186
post_only,
169187
reduce_only,
170188
quote_quantity,
171-
false,
172-
init_id,
173-
ts_init, // ts_event timestamp identical to ts_init
174-
ts_init,
175-
Some(price),
176-
None,
177-
None,
178-
None,
179-
None,
180-
None,
181-
expire_time,
182189
display_qty,
183190
emulation_trigger,
184191
trigger_instrument_id,
@@ -190,16 +197,10 @@ impl LimitOrder {
190197
exec_algorithm_params,
191198
exec_spawn_id,
192199
tags,
193-
);
194-
195-
Ok(Self {
196-
core: OrderCore::new(init_order),
197-
price,
198-
expire_time: expire_time.or(Some(UnixNanos::default())),
199-
is_post_only: post_only,
200-
display_qty,
201-
trigger_instrument_id,
202-
})
200+
init_id,
201+
ts_init,
202+
)
203+
.expect(FAILED)
203204
}
204205
}
205206

@@ -573,7 +574,6 @@ impl From<OrderInitialized> for LimitOrder {
573574
event.event_id,
574575
event.ts_event,
575576
)
576-
.unwrap()
577577
}
578578
}
579579

crates/model/src/python/orders/limit.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,7 @@ impl LimitOrder {
7676
exec_spawn_id: Option<ClientOrderId>,
7777
tags: Option<Vec<String>>,
7878
) -> PyResult<Self> {
79-
let exec_algorithm_params = exec_algorithm_params.map(str_indexmap_to_ustr);
80-
Self::new(
79+
Self::new_checked(
8180
trader_id,
8281
strategy_id,
8382
instrument_id,
@@ -98,7 +97,7 @@ impl LimitOrder {
9897
linked_order_ids,
9998
parent_order_id,
10099
exec_algorithm_id,
101-
exec_algorithm_params,
100+
exec_algorithm_params.map(str_indexmap_to_ustr),
102101
exec_spawn_id,
103102
tags.map(|vec| vec.into_iter().map(|s| Ustr::from(s.as_str())).collect()),
104103
init_id,
@@ -570,7 +569,8 @@ impl LimitOrder {
570569
.map(|x| x.extract::<&str>().unwrap().parse::<UUID4>().ok())?
571570
.unwrap();
572571
let ts_init = dict.get_item("ts_init")?.extract::<u64>()?;
573-
let limit_order = Self::new(
572+
573+
Self::new_checked(
574574
trader_id,
575575
strategy_id,
576576
instrument_id,
@@ -597,8 +597,7 @@ impl LimitOrder {
597597
init_id,
598598
ts_init.into(),
599599
)
600-
.unwrap();
601-
Ok(limit_order)
600+
.map_err(to_pyvalue_err)
602601
}
603602

604603
#[pyo3(name = "to_dict")]

crates/model/src/python/orders/limit_if_touched.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@
1414
// -------------------------------------------------------------------------------------------------
1515

1616
use indexmap::IndexMap;
17-
use nautilus_core::{UUID4, python::to_pyruntime_err};
17+
use nautilus_core::{
18+
UUID4,
19+
python::{to_pyruntime_err, to_pyvalue_err},
20+
};
1821
use pyo3::prelude::*;
1922
use rust_decimal::Decimal;
2023
use ustr::Ustr;
@@ -65,9 +68,8 @@ impl LimitIfTouchedOrder {
6568
exec_algorithm_params: Option<IndexMap<String, String>>,
6669
exec_spawn_id: Option<ClientOrderId>,
6770
tags: Option<Vec<String>>,
68-
) -> Self {
69-
let exec_algorithm_params = exec_algorithm_params.map(str_indexmap_to_ustr);
70-
Self::new(
71+
) -> PyResult<Self> {
72+
Self::new_checked(
7173
trader_id,
7274
strategy_id,
7375
instrument_id,
@@ -90,12 +92,13 @@ impl LimitIfTouchedOrder {
9092
linked_order_ids,
9193
parent_order_id,
9294
exec_algorithm_id,
93-
exec_algorithm_params,
95+
exec_algorithm_params.map(str_indexmap_to_ustr),
9496
exec_spawn_id,
9597
tags.map(|vec| vec.into_iter().map(|s| Ustr::from(s.as_str())).collect()),
9698
init_id,
9799
ts_init.into(),
98100
)
101+
.map_err(to_pyvalue_err)
99102
}
100103

101104
#[staticmethod]

crates/model/src/python/orders/market.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,6 @@ impl MarketOrder {
6767
exec_spawn_id: Option<ClientOrderId>,
6868
tags: Option<Vec<String>>,
6969
) -> PyResult<Self> {
70-
let exec_algorithm_params = exec_algorithm_params.map(str_indexmap_to_ustr);
7170
Self::new_checked(
7271
trader_id,
7372
strategy_id,
@@ -85,7 +84,7 @@ impl MarketOrder {
8584
linked_order_ids,
8685
parent_order_id,
8786
exec_algorithm_id,
88-
exec_algorithm_params,
87+
exec_algorithm_params.map(str_indexmap_to_ustr),
8988
exec_spawn_id,
9089
tags.map(|vec| vec.into_iter().map(|s| Ustr::from(s.as_str())).collect()),
9190
)

crates/model/src/python/orders/market_if_touched.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@
1414
// -------------------------------------------------------------------------------------------------
1515

1616
use indexmap::IndexMap;
17-
use nautilus_core::{UUID4, python::to_pyruntime_err};
17+
use nautilus_core::{
18+
UUID4,
19+
python::{to_pyruntime_err, to_pyvalue_err},
20+
};
1821
use pyo3::prelude::*;
1922
use rust_decimal::Decimal;
2023
use ustr::Ustr;
@@ -62,9 +65,8 @@ impl MarketIfTouchedOrder {
6265
exec_algorithm_params: Option<IndexMap<String, String>>,
6366
exec_spawn_id: Option<ClientOrderId>,
6467
tags: Option<Vec<String>>,
65-
) -> Self {
66-
let exec_algorithm_params = exec_algorithm_params.map(str_indexmap_to_ustr);
67-
Self::new(
68+
) -> PyResult<Self> {
69+
Self::new_checked(
6870
trader_id,
6971
strategy_id,
7072
instrument_id,
@@ -84,12 +86,13 @@ impl MarketIfTouchedOrder {
8486
linked_order_ids,
8587
parent_order_id,
8688
exec_algorithm_id,
87-
exec_algorithm_params,
89+
exec_algorithm_params.map(str_indexmap_to_ustr),
8890
exec_spawn_id,
8991
tags.map(|vec| vec.into_iter().map(|s| Ustr::from(s.as_str())).collect()),
9092
init_id,
9193
ts_init.into(),
9294
)
95+
.map_err(to_pyvalue_err)
9396
}
9497

9598
#[staticmethod]

0 commit comments

Comments
 (0)