#[cfg(feature = "live")]
use std::future::Future;
use std::{
thread,
time::{Duration, Instant},
};
use nautilus_core::UUID4;
use nautilus_model::{identifiers::TraderId, stubs::TestDefault};
use crate::logging::{
init_logging,
logger::{LogGuard, LoggerConfig},
writer::FileWriterConfig,
};
pub fn init_logger_for_testing(stdout_level: Option<log::LevelFilter>) -> anyhow::Result<LogGuard> {
let config = LoggerConfig {
stdout_level: stdout_level.unwrap_or(log::LevelFilter::Trace),
..Default::default()
};
init_logging(
TraderId::test_default(),
UUID4::new(),
config,
FileWriterConfig::default(),
)
}
pub fn wait_until<F>(mut condition: F, timeout: Duration)
where
F: FnMut() -> bool,
{
let start_time = Instant::now();
loop {
if condition() {
break;
}
assert!(
start_time.elapsed() <= timeout,
"Timeout waiting for condition after {:.1}s (limit {:.1}s)",
start_time.elapsed().as_secs_f64(),
timeout.as_secs_f64(),
);
thread::sleep(Duration::from_millis(100));
}
}
#[cfg(feature = "live")]
pub async fn wait_until_async<F, Fut>(mut condition: F, timeout: Duration)
where
F: FnMut() -> Fut,
Fut: Future<Output = bool>,
{
let start_time = Instant::now();
loop {
if condition().await {
break;
}
assert!(
start_time.elapsed() <= timeout,
"Timeout waiting for condition after {:.1}s (limit {:.1}s)",
start_time.elapsed().as_secs_f64(),
timeout.as_secs_f64(),
);
tokio::time::sleep(Duration::from_millis(100)).await;
}
}