use std::process::ExitCode; use config::Node; use log::debug; use crate::config::Config; use crate::supervisor::run_tasks; mod supervisor; mod linkmap; mod config; #[cfg(feature="irc")] mod bridge_irc; #[cfg(feature="irc-sp")] mod bridge_irc_sp; #[cfg(feature="matrix")] mod bridge_matrix; #[cfg(feature="discord")] mod bridge_discord; #[cfg(any( not(any(feature="tls-rustls", feature="tls-native")), all(feature="tls-rustls", feature="tls-native"), ))] compile_error!(r#"exactly one of "tls-rustls" or "tls-native" must be enabled."#); #[tokio::main] async fn main() -> ExitCode { env_logger::init(); debug!("reading arguments"); let mut args = std::env::args(); let cmd_name = args.next() .unwrap_or_else(|| env!("CARGO_PKG_NAME").to_owned()); let Some(conf_filename) = args.next() else { eprintln!("Usage: {cmd_name} "); return ExitCode::FAILURE }; debug!("reading config file"); let conf_str = match std::fs::read_to_string(&conf_filename) { Ok(s) => s, Err(e) => { eprintln!("Failed to read {conf_filename}: {e}"); return ExitCode::FAILURE } }; debug!("parsing config"); let config: Config = match toml::from_str(&conf_str) { Ok(c) => c, Err(e) => { eprintln!("{e}"); return ExitCode::SUCCESS } }; let tasks = config.nodes.into_iter() .map(|(k, t)| (k, Node::into_task(t))) .collect(); debug!("running tasks"); run_tasks(tasks).await; ExitCode::SUCCESS }