use crate::settings::get_settings; use clap::Parser; use log::{LevelFilter, info}; mod db; mod device_finders; mod events; mod mac_vendor_finder; mod model; mod scanner; mod settings; mod web_server; #[cfg(test)] mod tests_common; // Command line parameters #[derive(Parser, Debug)] #[command(version, about, long_about = None)] struct Args { /// Config file path #[arg(short, long)] config: Option, } #[tokio::main] async fn main() -> Result<(), String> { // Parse command line parameters and init settings // this is not thread safe so it needs to run just once let args = Args::parse(); let config_path = args .config .unwrap_or(settings::DEFAULT_CONFIG_FILE_PATH.to_string()); settings::init(config_path); // Initialize logging let log_level = match get_settings().log.level.as_str() { "off" => LevelFilter::Off, "error" => LevelFilter::Error, "warn" => LevelFilter::Warn, "info" => LevelFilter::Info, "debug" => LevelFilter::Debug, "trace" => LevelFilter::Trace, _ => LevelFilter::Error, }; env_logger::Builder::new() .filter(None, log_level) .write_style(env_logger::WriteStyle::Always) .init(); // Now onto the important stuff info!("Starting up oott"); // Initialize database db::init_db().await?; // Start the device scanner and web server (for API and UI) in parallel tokio::join!(scanner::scan(), web_server::serve()).0 }