use std::{fmt::Debug, time::Duration};
use nautilus_common::{
cache::CacheConfig, enums::Environment, logging::logger::LoggerConfig,
msgbus::database::MessageBusConfig,
};
use nautilus_core::{UUID4, UnixNanos};
use nautilus_data::engine::config::DataEngineConfig;
use nautilus_execution::engine::config::ExecutionEngineConfig;
use nautilus_model::identifiers::TraderId;
use nautilus_portfolio::config::PortfolioConfig;
use nautilus_risk::engine::config::RiskEngineConfig;
pub trait NautilusKernelConfig: Debug {
fn environment(&self) -> Environment;
fn trader_id(&self) -> TraderId;
fn load_state(&self) -> bool;
fn save_state(&self) -> bool;
fn logging(&self) -> LoggerConfig;
fn instance_id(&self) -> Option<UUID4>;
fn timeout_connection(&self) -> Duration;
fn timeout_reconciliation(&self) -> Duration;
fn timeout_portfolio(&self) -> Duration;
fn timeout_disconnection(&self) -> Duration;
fn delay_post_stop(&self) -> Duration;
fn timeout_shutdown(&self) -> Duration;
fn cache(&self) -> Option<CacheConfig>;
fn msgbus(&self) -> Option<MessageBusConfig>;
fn data_engine(&self) -> Option<DataEngineConfig>;
fn risk_engine(&self) -> Option<RiskEngineConfig>;
fn exec_engine(&self) -> Option<ExecutionEngineConfig>;
fn portfolio(&self) -> Option<PortfolioConfig>;
fn streaming(&self) -> Option<StreamingConfig>;
}
#[derive(Debug, Clone, bon::Builder)]
pub struct KernelConfig {
#[builder(default = Environment::Backtest)]
pub environment: Environment,
#[builder(default)]
pub trader_id: TraderId,
#[builder(default)]
pub load_state: bool,
#[builder(default)]
pub save_state: bool,
#[builder(default)]
pub logging: LoggerConfig,
pub instance_id: Option<UUID4>,
#[builder(default = Duration::from_secs(60))]
pub timeout_connection: Duration,
#[builder(default = Duration::from_secs(30))]
pub timeout_reconciliation: Duration,
#[builder(default = Duration::from_secs(10))]
pub timeout_portfolio: Duration,
#[builder(default = Duration::from_secs(10))]
pub timeout_disconnection: Duration,
#[builder(default = Duration::from_secs(10))]
pub delay_post_stop: Duration,
#[builder(default = Duration::from_secs(5))]
pub timeout_shutdown: Duration,
pub cache: Option<CacheConfig>,
pub msgbus: Option<MessageBusConfig>,
pub data_engine: Option<DataEngineConfig>,
pub risk_engine: Option<RiskEngineConfig>,
pub exec_engine: Option<ExecutionEngineConfig>,
pub portfolio: Option<PortfolioConfig>,
pub streaming: Option<StreamingConfig>,
}
impl NautilusKernelConfig for KernelConfig {
fn environment(&self) -> Environment {
self.environment
}
fn trader_id(&self) -> TraderId {
self.trader_id
}
fn load_state(&self) -> bool {
self.load_state
}
fn save_state(&self) -> bool {
self.save_state
}
fn logging(&self) -> LoggerConfig {
self.logging.clone()
}
fn instance_id(&self) -> Option<UUID4> {
self.instance_id
}
fn timeout_connection(&self) -> Duration {
self.timeout_connection
}
fn timeout_reconciliation(&self) -> Duration {
self.timeout_reconciliation
}
fn timeout_portfolio(&self) -> Duration {
self.timeout_portfolio
}
fn timeout_disconnection(&self) -> Duration {
self.timeout_disconnection
}
fn delay_post_stop(&self) -> Duration {
self.delay_post_stop
}
fn timeout_shutdown(&self) -> Duration {
self.timeout_shutdown
}
fn cache(&self) -> Option<CacheConfig> {
self.cache.clone()
}
fn msgbus(&self) -> Option<MessageBusConfig> {
self.msgbus.clone()
}
fn data_engine(&self) -> Option<DataEngineConfig> {
self.data_engine.clone()
}
fn risk_engine(&self) -> Option<RiskEngineConfig> {
self.risk_engine.clone()
}
fn exec_engine(&self) -> Option<ExecutionEngineConfig> {
self.exec_engine.clone()
}
fn portfolio(&self) -> Option<PortfolioConfig> {
self.portfolio
}
fn streaming(&self) -> Option<StreamingConfig> {
self.streaming.clone()
}
}
impl Default for KernelConfig {
fn default() -> Self {
Self::builder().build()
}
}
#[derive(Debug, Clone)]
pub enum RotationConfig {
Size {
max_size: u64,
},
Interval {
interval_ns: u64,
},
ScheduledDates {
interval_ns: u64,
schedule_ns: UnixNanos,
},
NoRotation,
}
#[derive(Debug, Clone, bon::Builder)]
pub struct StreamingConfig {
pub catalog_path: String,
pub fs_protocol: String,
pub flush_interval_ms: u64,
pub replace_existing: bool,
pub rotation_config: RotationConfig,
}
impl StreamingConfig {
#[must_use]
pub const fn new(
catalog_path: String,
fs_protocol: String,
flush_interval_ms: u64,
replace_existing: bool,
rotation_config: RotationConfig,
) -> Self {
Self {
catalog_path,
fs_protocol,
flush_interval_ms,
replace_existing,
rotation_config,
}
}
}