nautilus_model/ffi/
enums.rs1use std::{ffi::c_char, str::FromStr};
17
18use nautilus_core::ffi::string::{cstr_as_str, str_to_cstr};
19
20use crate::enums::{
21 AccountType, AggregationSource, AggressorSide, AssetClass, BarAggregation, BookAction,
22 BookType, ContingencyType, CurrencyType, InstrumentClass, InstrumentCloseType, LiquiditySide,
23 MarketStatus, MarketStatusAction, OmsType, OptionKind, OrderSide, OrderStatus, OrderType,
24 PositionSide, PriceType, RecordFlag, TimeInForce, TradingState, TrailingOffsetType,
25 TriggerType,
26};
27
28#[unsafe(no_mangle)]
29pub extern "C" fn account_type_to_cstr(value: AccountType) -> *const c_char {
30 str_to_cstr(value.as_ref())
31}
32
33#[unsafe(no_mangle)]
43pub unsafe extern "C" fn account_type_from_cstr(ptr: *const c_char) -> AccountType {
44 let value = unsafe { cstr_as_str(ptr) };
45 AccountType::from_str(value)
46 .unwrap_or_else(|_| panic!("invalid `AccountType` enum string value, was '{value}'"))
47}
48
49#[unsafe(no_mangle)]
50pub extern "C" fn aggregation_source_to_cstr(value: AggregationSource) -> *const c_char {
51 str_to_cstr(value.as_ref())
52}
53
54#[unsafe(no_mangle)]
64pub unsafe extern "C" fn aggregation_source_from_cstr(ptr: *const c_char) -> AggregationSource {
65 let value = unsafe { cstr_as_str(ptr) };
66 AggregationSource::from_str(value)
67 .unwrap_or_else(|_| panic!("invalid `AggregationSource` enum string value, was '{value}'"))
68}
69
70#[unsafe(no_mangle)]
71pub extern "C" fn aggressor_side_to_cstr(value: AggressorSide) -> *const c_char {
72 str_to_cstr(value.as_ref())
73}
74
75#[unsafe(no_mangle)]
85pub unsafe extern "C" fn aggressor_side_from_cstr(ptr: *const c_char) -> AggressorSide {
86 let value = unsafe { cstr_as_str(ptr) };
87 AggressorSide::from_str(value)
88 .unwrap_or_else(|_| panic!("invalid `AggressorSide` enum string value, was '{value}'"))
89}
90
91#[unsafe(no_mangle)]
92pub extern "C" fn asset_class_to_cstr(value: AssetClass) -> *const c_char {
93 str_to_cstr(value.as_ref())
94}
95
96#[unsafe(no_mangle)]
106pub unsafe extern "C" fn asset_class_from_cstr(ptr: *const c_char) -> AssetClass {
107 let value = unsafe { cstr_as_str(ptr) };
108 AssetClass::from_str(value)
109 .unwrap_or_else(|_| panic!("invalid `AssetClass` enum string value, was '{value}'"))
110}
111
112#[unsafe(no_mangle)]
113pub extern "C" fn instrument_class_to_cstr(value: InstrumentClass) -> *const c_char {
114 str_to_cstr(value.as_ref())
115}
116
117#[unsafe(no_mangle)]
127pub unsafe extern "C" fn instrument_class_from_cstr(ptr: *const c_char) -> InstrumentClass {
128 let value = unsafe { cstr_as_str(ptr) };
129 InstrumentClass::from_str(value)
130 .unwrap_or_else(|_| panic!("invalid `InstrumentClass` enum string value, was '{value}'"))
131}
132
133#[unsafe(no_mangle)]
134pub extern "C" fn bar_aggregation_to_cstr(value: BarAggregation) -> *const c_char {
135 str_to_cstr(value.as_ref())
136}
137
138#[unsafe(no_mangle)]
148pub unsafe extern "C" fn bar_aggregation_from_cstr(ptr: *const c_char) -> BarAggregation {
149 let value = unsafe { cstr_as_str(ptr) };
150 BarAggregation::from_str(value)
151 .unwrap_or_else(|_| panic!("invalid `BarAggregation` enum string value, was '{value}'"))
152}
153
154#[unsafe(no_mangle)]
155pub extern "C" fn book_action_to_cstr(value: BookAction) -> *const c_char {
156 str_to_cstr(value.as_ref())
157}
158
159#[unsafe(no_mangle)]
169pub unsafe extern "C" fn book_action_from_cstr(ptr: *const c_char) -> BookAction {
170 let value = unsafe { cstr_as_str(ptr) };
171 BookAction::from_str(value)
172 .unwrap_or_else(|_| panic!("invalid `BookAction` enum string value, was '{value}'"))
173}
174
175#[unsafe(no_mangle)]
176pub extern "C" fn book_type_to_cstr(value: BookType) -> *const c_char {
177 str_to_cstr(value.as_ref())
178}
179
180#[unsafe(no_mangle)]
190pub unsafe extern "C" fn book_type_from_cstr(ptr: *const c_char) -> BookType {
191 let value = unsafe { cstr_as_str(ptr) };
192 BookType::from_str(value)
193 .unwrap_or_else(|_| panic!("invalid `BookType` enum string value, was '{value}'"))
194}
195
196#[unsafe(no_mangle)]
197pub extern "C" fn contingency_type_to_cstr(value: ContingencyType) -> *const c_char {
198 str_to_cstr(value.as_ref())
199}
200
201#[unsafe(no_mangle)]
211pub unsafe extern "C" fn contingency_type_from_cstr(ptr: *const c_char) -> ContingencyType {
212 let value = unsafe { cstr_as_str(ptr) };
213 ContingencyType::from_str(value)
214 .unwrap_or_else(|_| panic!("invalid `ContingencyType` enum string value, was '{value}'"))
215}
216
217#[unsafe(no_mangle)]
218pub extern "C" fn currency_type_to_cstr(value: CurrencyType) -> *const c_char {
219 str_to_cstr(value.as_ref())
220}
221
222#[unsafe(no_mangle)]
232pub unsafe extern "C" fn currency_type_from_cstr(ptr: *const c_char) -> CurrencyType {
233 let value = unsafe { cstr_as_str(ptr) };
234 CurrencyType::from_str(value)
235 .unwrap_or_else(|_| panic!("invalid `CurrencyType` enum string value, was '{value}'"))
236}
237
238#[unsafe(no_mangle)]
248pub unsafe extern "C" fn instrument_close_type_from_cstr(
249 ptr: *const c_char,
250) -> InstrumentCloseType {
251 let value = unsafe { cstr_as_str(ptr) };
252 InstrumentCloseType::from_str(value).unwrap_or_else(|_| {
253 panic!("invalid `InstrumentCloseType` enum string value, was '{value}'")
254 })
255}
256
257#[unsafe(no_mangle)]
258pub extern "C" fn instrument_close_type_to_cstr(value: InstrumentCloseType) -> *const c_char {
259 str_to_cstr(value.as_ref())
260}
261
262#[unsafe(no_mangle)]
263pub extern "C" fn liquidity_side_to_cstr(value: LiquiditySide) -> *const c_char {
264 str_to_cstr(value.as_ref())
265}
266
267#[unsafe(no_mangle)]
277pub unsafe extern "C" fn liquidity_side_from_cstr(ptr: *const c_char) -> LiquiditySide {
278 let value = unsafe { cstr_as_str(ptr) };
279 LiquiditySide::from_str(value)
280 .unwrap_or_else(|_| panic!("invalid `LiquiditySide` enum string value, was '{value}'"))
281}
282
283#[unsafe(no_mangle)]
284pub extern "C" fn market_status_to_cstr(value: MarketStatus) -> *const c_char {
285 str_to_cstr(value.as_ref())
286}
287
288#[unsafe(no_mangle)]
298pub unsafe extern "C" fn market_status_from_cstr(ptr: *const c_char) -> MarketStatus {
299 let value = unsafe { cstr_as_str(ptr) };
300 MarketStatus::from_str(value)
301 .unwrap_or_else(|_| panic!("invalid `MarketStatus` enum string value, was '{value}'"))
302}
303
304#[unsafe(no_mangle)]
305pub extern "C" fn market_status_action_to_cstr(value: MarketStatusAction) -> *const c_char {
306 str_to_cstr(value.as_ref())
307}
308
309#[unsafe(no_mangle)]
319pub unsafe extern "C" fn market_status_action_from_cstr(ptr: *const c_char) -> MarketStatusAction {
320 let value = unsafe { cstr_as_str(ptr) };
321 MarketStatusAction::from_str(value)
322 .unwrap_or_else(|_| panic!("invalid `MarketStatusAction` enum string value, was '{value}'"))
323}
324
325#[unsafe(no_mangle)]
326pub extern "C" fn oms_type_to_cstr(value: OmsType) -> *const c_char {
327 str_to_cstr(value.as_ref())
328}
329
330#[unsafe(no_mangle)]
340pub unsafe extern "C" fn oms_type_from_cstr(ptr: *const c_char) -> OmsType {
341 let value = unsafe { cstr_as_str(ptr) };
342 OmsType::from_str(value)
343 .unwrap_or_else(|_| panic!("invalid `OmsType` enum string value, was '{value}'"))
344}
345
346#[unsafe(no_mangle)]
347pub extern "C" fn option_kind_to_cstr(value: OptionKind) -> *const c_char {
348 str_to_cstr(value.as_ref())
349}
350
351#[unsafe(no_mangle)]
361pub unsafe extern "C" fn option_kind_from_cstr(ptr: *const c_char) -> OptionKind {
362 let value = unsafe { cstr_as_str(ptr) };
363 OptionKind::from_str(value)
364 .unwrap_or_else(|_| panic!("invalid `OptionKind` enum string value, was '{value}'"))
365}
366
367#[unsafe(no_mangle)]
368pub extern "C" fn order_side_to_cstr(value: OrderSide) -> *const c_char {
369 str_to_cstr(value.as_ref())
370}
371
372#[unsafe(no_mangle)]
382pub unsafe extern "C" fn order_side_from_cstr(ptr: *const c_char) -> OrderSide {
383 let value = unsafe { cstr_as_str(ptr) };
384 OrderSide::from_str(value)
385 .unwrap_or_else(|_| panic!("invalid `OrderSide` enum string value, was '{value}'"))
386}
387
388#[unsafe(no_mangle)]
389pub extern "C" fn order_status_to_cstr(value: OrderStatus) -> *const c_char {
390 str_to_cstr(value.as_ref())
391}
392
393#[unsafe(no_mangle)]
403pub unsafe extern "C" fn order_status_from_cstr(ptr: *const c_char) -> OrderStatus {
404 let value = unsafe { cstr_as_str(ptr) };
405 OrderStatus::from_str(value)
406 .unwrap_or_else(|_| panic!("invalid `OrderStatus` enum string value, was '{value}'"))
407}
408
409#[unsafe(no_mangle)]
410pub extern "C" fn order_type_to_cstr(value: OrderType) -> *const c_char {
411 str_to_cstr(value.as_ref())
412}
413
414#[unsafe(no_mangle)]
424pub unsafe extern "C" fn order_type_from_cstr(ptr: *const c_char) -> OrderType {
425 let value = unsafe { cstr_as_str(ptr) };
426 OrderType::from_str(value)
427 .unwrap_or_else(|_| panic!("invalid `OrderType` enum string value, was '{value}'"))
428}
429
430#[unsafe(no_mangle)]
431pub extern "C" fn position_side_to_cstr(value: PositionSide) -> *const c_char {
432 str_to_cstr(value.as_ref())
433}
434
435#[unsafe(no_mangle)]
445pub unsafe extern "C" fn position_side_from_cstr(ptr: *const c_char) -> PositionSide {
446 let value = unsafe { cstr_as_str(ptr) };
447 PositionSide::from_str(value)
448 .unwrap_or_else(|_| panic!("invalid `PositionSide` enum string value, was '{value}'"))
449}
450
451#[unsafe(no_mangle)]
452pub extern "C" fn price_type_to_cstr(value: PriceType) -> *const c_char {
453 str_to_cstr(value.as_ref())
454}
455
456#[unsafe(no_mangle)]
466pub unsafe extern "C" fn price_type_from_cstr(ptr: *const c_char) -> PriceType {
467 let value = unsafe { cstr_as_str(ptr) };
468 PriceType::from_str(value)
469 .unwrap_or_else(|_| panic!("invalid `PriceType` enum string value, was '{value}'"))
470}
471
472#[unsafe(no_mangle)]
473pub extern "C" fn record_flag_to_cstr(value: RecordFlag) -> *const c_char {
474 str_to_cstr(value.as_ref())
475}
476
477#[unsafe(no_mangle)]
487pub unsafe extern "C" fn record_flag_from_cstr(ptr: *const c_char) -> RecordFlag {
488 let value = unsafe { cstr_as_str(ptr) };
489 RecordFlag::from_str(value)
490 .unwrap_or_else(|_| panic!("invalid `RecordFlag` enum string value, was '{value}'"))
491}
492
493#[unsafe(no_mangle)]
494pub extern "C" fn time_in_force_to_cstr(value: TimeInForce) -> *const c_char {
495 str_to_cstr(value.as_ref())
496}
497
498#[unsafe(no_mangle)]
508pub unsafe extern "C" fn time_in_force_from_cstr(ptr: *const c_char) -> TimeInForce {
509 let value = unsafe { cstr_as_str(ptr) };
510 TimeInForce::from_str(value)
511 .unwrap_or_else(|_| panic!("invalid `TimeInForce` enum string value, was '{value}'"))
512}
513
514#[unsafe(no_mangle)]
515pub extern "C" fn trading_state_to_cstr(value: TradingState) -> *const c_char {
516 str_to_cstr(value.as_ref())
517}
518
519#[unsafe(no_mangle)]
529pub unsafe extern "C" fn trading_state_from_cstr(ptr: *const c_char) -> TradingState {
530 let value = unsafe { cstr_as_str(ptr) };
531 TradingState::from_str(value)
532 .unwrap_or_else(|_| panic!("invalid `TradingState` enum string value, was '{value}'"))
533}
534
535#[unsafe(no_mangle)]
536pub extern "C" fn trailing_offset_type_to_cstr(value: TrailingOffsetType) -> *const c_char {
537 str_to_cstr(value.as_ref())
538}
539
540#[unsafe(no_mangle)]
550pub unsafe extern "C" fn trailing_offset_type_from_cstr(ptr: *const c_char) -> TrailingOffsetType {
551 let value = unsafe { cstr_as_str(ptr) };
552 TrailingOffsetType::from_str(value)
553 .unwrap_or_else(|_| panic!("invalid `TrailingOffsetType` enum string value, was '{value}'"))
554}
555
556#[unsafe(no_mangle)]
557pub extern "C" fn trigger_type_to_cstr(value: TriggerType) -> *const c_char {
558 str_to_cstr(value.as_ref())
559}
560
561#[unsafe(no_mangle)]
571pub unsafe extern "C" fn trigger_type_from_cstr(ptr: *const c_char) -> TriggerType {
572 let value = unsafe { cstr_as_str(ptr) };
573 TriggerType::from_str(value)
574 .unwrap_or_else(|_| panic!("invalid `TriggerType` enum string value, was '{value}'"))
575}
576
577#[cfg(test)]
578mod tests {
579 use rstest::rstest;
580
581 use super::*;
582
583 #[rstest]
584 fn test_name() {
585 assert_eq!(OrderSide::NoOrderSide.name(), "NO_ORDER_SIDE");
586 assert_eq!(OrderSide::Buy.name(), "BUY");
587 assert_eq!(OrderSide::Sell.name(), "SELL");
588 }
589
590 #[rstest]
591 fn test_value() {
592 assert_eq!(OrderSide::NoOrderSide.value(), 0);
593 assert_eq!(OrderSide::Buy.value(), 1);
594 assert_eq!(OrderSide::Sell.value(), 2);
595 }
596}