use cu29_clock::RobotClock;
use cu29_log_runtime::LoggerRuntime;
use cu29_traits::{CuResult, UnifiedLogType};
use cu29_unifiedlog::{stream_write, UnifiedLogger, UnifiedLoggerBuilder, UnifiedLoggerWrite};
use simplelog::TermLogger;
#[cfg(debug_assertions)]
use simplelog::{ColorChoice, Config, LevelFilter, TerminalMode};
use std::path::Path;
use std::sync::{Arc, Mutex};
pub struct CopperContext {
pub unified_logger: Arc<Mutex<UnifiedLoggerWrite>>,
pub logger_runtime: LoggerRuntime,
pub clock: RobotClock,
}
pub fn basic_copper_setup(
unifiedlogger_output_base_name: &Path,
slab_size: Option<usize>,
_text_log: bool,
clock: Option<RobotClock>,
) -> CuResult<CopperContext> {
let preallocated_size = slab_size.unwrap_or(1024 * 1024 * 10);
let UnifiedLogger::Write(logger) = UnifiedLoggerBuilder::new()
.write(true)
.create(true)
.file_base_name(unifiedlogger_output_base_name)
.preallocated_size(preallocated_size)
.build()
.expect("Failed to create logger")
else {
panic!("Failed to create logger")
};
let unified_logger = Arc::new(Mutex::new(logger));
let structured_stream = stream_write(
unified_logger.clone(),
UnifiedLogType::StructuredLogLine,
4096 * 10,
);
#[cfg(debug_assertions)]
let extra: Option<TermLogger> = if _text_log {
let slow_text_logger = TermLogger::new(
LevelFilter::Debug,
Config::default(),
TerminalMode::Mixed,
ColorChoice::Auto,
);
Some(*slow_text_logger)
} else {
None
};
#[cfg(not(debug_assertions))]
let extra: Option<TermLogger> = None;
let clock = clock.unwrap_or_default();
let structured_logging = LoggerRuntime::init(clock.clone(), structured_stream, extra);
Ok(CopperContext {
unified_logger: unified_logger.clone(),
logger_runtime: structured_logging,
clock,
})
}