nautilus_execution/client/
core.rs1use std::sync::atomic::{AtomicBool, Ordering};
19
20use nautilus_common::cache::{Cache, CacheView};
21use nautilus_model::{
22 enums::{AccountType, OmsType},
23 identifiers::{AccountId, ClientId, ClientOrderId, TraderId, Venue},
24 orders::{OrderAny, OrderList},
25 types::Currency,
26};
27
28#[derive(Debug)]
39pub struct ExecutionClientCore {
40 pub trader_id: TraderId,
41 pub client_id: ClientId,
42 pub venue: Venue,
43 pub oms_type: OmsType,
44 pub account_id: AccountId,
45 pub account_type: AccountType,
46 pub base_currency: Option<Currency>,
47 connected: AtomicBool,
48 started: AtomicBool,
49 instruments_initialized: AtomicBool,
50 cache: CacheView,
51}
52
53impl Clone for ExecutionClientCore {
54 fn clone(&self) -> Self {
55 Self {
56 trader_id: self.trader_id,
57 client_id: self.client_id,
58 venue: self.venue,
59 oms_type: self.oms_type,
60 account_id: self.account_id,
61 account_type: self.account_type,
62 base_currency: self.base_currency,
63 connected: AtomicBool::new(self.connected.load(Ordering::Acquire)),
64 started: AtomicBool::new(self.started.load(Ordering::Acquire)),
65 instruments_initialized: AtomicBool::new(
66 self.instruments_initialized.load(Ordering::Acquire),
67 ),
68 cache: self.cache.clone(),
69 }
70 }
71}
72
73impl ExecutionClientCore {
74 #[expect(clippy::too_many_arguments)]
76 #[must_use]
77 pub fn new(
78 trader_id: TraderId,
79 client_id: ClientId,
80 venue: Venue,
81 oms_type: OmsType,
82 account_id: AccountId,
83 account_type: AccountType,
84 base_currency: Option<Currency>,
85 cache: impl Into<CacheView>,
86 ) -> Self {
87 Self {
88 trader_id,
89 client_id,
90 venue,
91 oms_type,
92 account_id,
93 account_type,
94 base_currency,
95 connected: AtomicBool::new(false),
96 started: AtomicBool::new(false),
97 instruments_initialized: AtomicBool::new(false),
98 cache: cache.into(),
99 }
100 }
101
102 pub fn cache(&self) -> std::cell::Ref<'_, Cache> {
104 self.cache.borrow()
105 }
106
107 pub fn get_order(&self, client_order_id: &ClientOrderId) -> anyhow::Result<OrderAny> {
113 Ok(self.cache.borrow().try_order_owned(client_order_id)?)
114 }
115
116 pub fn get_orders_for_list(&self, order_list: &OrderList) -> anyhow::Result<Vec<OrderAny>> {
122 order_list
123 .client_order_ids
124 .iter()
125 .map(|id| self.get_order(id))
126 .collect()
127 }
128
129 #[must_use]
131 pub fn is_connected(&self) -> bool {
132 self.connected.load(Ordering::Acquire)
133 }
134
135 #[must_use]
137 pub fn is_disconnected(&self) -> bool {
138 !self.is_connected()
139 }
140
141 pub fn set_connected(&self) {
143 self.connected.store(true, Ordering::Release);
144 }
145
146 pub fn set_disconnected(&self) {
148 self.connected.store(false, Ordering::Release);
149 }
150
151 #[must_use]
153 pub fn is_started(&self) -> bool {
154 self.started.load(Ordering::Acquire)
155 }
156
157 #[must_use]
159 pub fn is_stopped(&self) -> bool {
160 !self.is_started()
161 }
162
163 pub fn set_started(&self) {
165 self.started.store(true, Ordering::Release);
166 }
167
168 pub fn set_stopped(&self) {
170 self.started.store(false, Ordering::Release);
171 }
172
173 #[must_use]
175 pub fn instruments_initialized(&self) -> bool {
176 self.instruments_initialized.load(Ordering::Acquire)
177 }
178
179 pub fn set_instruments_initialized(&self) {
181 self.instruments_initialized.store(true, Ordering::Release);
182 }
183
184 pub const fn set_account_id(&mut self, account_id: AccountId) {
186 self.account_id = account_id;
187 }
188}