nautilus_system/
config.rs1use std::{fmt::Debug, time::Duration};
17
18use nautilus_common::{
19 cache::CacheConfig, enums::Environment, logging::logger::LoggerConfig,
20 msgbus::database::MessageBusConfig,
21};
22use nautilus_core::{UUID4, UnixNanos};
23use nautilus_data::engine::config::DataEngineConfig;
24use nautilus_execution::engine::config::ExecutionEngineConfig;
25use nautilus_model::identifiers::TraderId;
26use nautilus_portfolio::config::PortfolioConfig;
27use nautilus_risk::engine::config::RiskEngineConfig;
28
29pub trait NautilusKernelConfig: Debug {
31 fn environment(&self) -> Environment;
33 fn trader_id(&self) -> TraderId;
35 fn load_state(&self) -> bool;
37 fn save_state(&self) -> bool;
39 fn logging(&self) -> LoggerConfig;
41 fn instance_id(&self) -> Option<UUID4>;
43 fn timeout_connection(&self) -> Duration;
45 fn timeout_reconciliation(&self) -> Duration;
47 fn timeout_portfolio(&self) -> Duration;
49 fn timeout_disconnection(&self) -> Duration;
51 fn delay_post_stop(&self) -> Duration;
53 fn timeout_shutdown(&self) -> Duration;
55 fn cache(&self) -> Option<CacheConfig>;
57 fn msgbus(&self) -> Option<MessageBusConfig>;
59 fn data_engine(&self) -> Option<DataEngineConfig>;
61 fn risk_engine(&self) -> Option<RiskEngineConfig>;
63 fn exec_engine(&self) -> Option<ExecutionEngineConfig>;
65 fn portfolio(&self) -> Option<PortfolioConfig>;
67 fn streaming(&self) -> Option<StreamingConfig>;
69}
70
71#[derive(Debug, Clone, bon::Builder)]
73pub struct KernelConfig {
74 #[builder(default = Environment::Backtest)]
76 pub environment: Environment,
77 #[builder(default)]
79 pub trader_id: TraderId,
80 #[builder(default)]
82 pub load_state: bool,
83 #[builder(default)]
85 pub save_state: bool,
86 #[builder(default)]
88 pub logging: LoggerConfig,
89 pub instance_id: Option<UUID4>,
91 #[builder(default = Duration::from_secs(120))]
93 pub timeout_connection: Duration,
94 #[builder(default = Duration::from_secs(30))]
96 pub timeout_reconciliation: Duration,
97 #[builder(default = Duration::from_secs(10))]
99 pub timeout_portfolio: Duration,
100 #[builder(default = Duration::from_secs(10))]
102 pub timeout_disconnection: Duration,
103 #[builder(default = Duration::from_secs(10))]
105 pub delay_post_stop: Duration,
106 #[builder(default = Duration::from_secs(5))]
108 pub timeout_shutdown: Duration,
109 pub cache: Option<CacheConfig>,
111 pub msgbus: Option<MessageBusConfig>,
113 pub data_engine: Option<DataEngineConfig>,
115 pub risk_engine: Option<RiskEngineConfig>,
117 pub exec_engine: Option<ExecutionEngineConfig>,
119 pub portfolio: Option<PortfolioConfig>,
121 pub streaming: Option<StreamingConfig>,
123}
124
125impl NautilusKernelConfig for KernelConfig {
126 fn environment(&self) -> Environment {
127 self.environment
128 }
129
130 fn trader_id(&self) -> TraderId {
131 self.trader_id
132 }
133
134 fn load_state(&self) -> bool {
135 self.load_state
136 }
137
138 fn save_state(&self) -> bool {
139 self.save_state
140 }
141
142 fn logging(&self) -> LoggerConfig {
143 self.logging.clone()
144 }
145
146 fn instance_id(&self) -> Option<UUID4> {
147 self.instance_id
148 }
149
150 fn timeout_connection(&self) -> Duration {
151 self.timeout_connection
152 }
153
154 fn timeout_reconciliation(&self) -> Duration {
155 self.timeout_reconciliation
156 }
157
158 fn timeout_portfolio(&self) -> Duration {
159 self.timeout_portfolio
160 }
161
162 fn timeout_disconnection(&self) -> Duration {
163 self.timeout_disconnection
164 }
165
166 fn delay_post_stop(&self) -> Duration {
167 self.delay_post_stop
168 }
169
170 fn timeout_shutdown(&self) -> Duration {
171 self.timeout_shutdown
172 }
173
174 fn cache(&self) -> Option<CacheConfig> {
175 self.cache.clone()
176 }
177
178 fn msgbus(&self) -> Option<MessageBusConfig> {
179 self.msgbus.clone()
180 }
181
182 fn data_engine(&self) -> Option<DataEngineConfig> {
183 self.data_engine.clone()
184 }
185
186 fn risk_engine(&self) -> Option<RiskEngineConfig> {
187 self.risk_engine.clone()
188 }
189
190 fn exec_engine(&self) -> Option<ExecutionEngineConfig> {
191 self.exec_engine.clone()
192 }
193
194 fn portfolio(&self) -> Option<PortfolioConfig> {
195 self.portfolio
196 }
197
198 fn streaming(&self) -> Option<StreamingConfig> {
199 self.streaming.clone()
200 }
201}
202
203impl Default for KernelConfig {
204 fn default() -> Self {
205 Self::builder().build()
206 }
207}
208
209#[derive(Debug, Clone)]
211pub enum RotationConfig {
212 Size {
214 max_size: u64,
216 },
217 Interval {
219 interval_ns: u64,
221 },
222 ScheduledDates {
224 interval_ns: u64,
226 schedule_ns: UnixNanos,
228 },
229 NoRotation,
231}
232
233#[derive(Debug, Clone, bon::Builder)]
235pub struct StreamingConfig {
236 pub catalog_path: String,
238 pub fs_protocol: String,
240 pub flush_interval_ms: u64,
242 pub replace_existing: bool,
244 pub rotation_config: RotationConfig,
246}
247
248impl StreamingConfig {
249 #[must_use]
251 pub const fn new(
252 catalog_path: String,
253 fs_protocol: String,
254 flush_interval_ms: u64,
255 replace_existing: bool,
256 rotation_config: RotationConfig,
257 ) -> Self {
258 Self {
259 catalog_path,
260 fs_protocol,
261 flush_interval_ms,
262 replace_existing,
263 rotation_config,
264 }
265 }
266}