watchmend 0.0.1

Watchmen is a daemon process manager that for you manage and keep your application online 24/7
Documentation
use colored::Colorize;
use std::{error::Error, path::Path};
use tracing::{info, Level};
use tracing_subscriber::{fmt, EnvFilter};
use watchmend::common::{arg::DaemonArgs, config::Config};
use watchmend::{engine, monitor::run_monitor};

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
    let clargs = DaemonArgs::new();
    if clargs.version {
        println!(
            "{} {}",
            "Watchmen rust".green(),
            env!("CARGO_PKG_VERSION").green()
        );
        return Ok(());
    }

    let load = clargs.load;

    let config: Config = Config::init(clargs.config.clone())?;

    // ====================================================

    let log_path = config
        .watchmen
        .log_dir
        .clone()
        .unwrap_or("./logs".to_string());
    let path: &Path = Path::new(&log_path);
    if !path.exists() {
        std::fs::create_dir_all(path)?;
    }
    let mut filter = EnvFilter::from_default_env();
    if Some("debug".to_string()) == config.watchmen.log_level {
        filter = filter.add_directive(Level::ERROR.into());
        filter = filter.add_directive(Level::WARN.into());
        filter = filter.add_directive(Level::INFO.into());
        filter = filter.add_directive(Level::DEBUG.into());
    } else if Some("info".to_string()) == config.watchmen.log_level {
        filter = filter.add_directive(Level::ERROR.into());
        filter = filter.add_directive(Level::WARN.into());
        filter = filter.add_directive(Level::INFO.into());
    } else if Some("warn".to_string()) == config.watchmen.log_level {
        filter = filter.add_directive(Level::ERROR.into());
        filter = filter.add_directive(Level::WARN.into());
    } else if Some("error".to_string()) == config.watchmen.log_level {
        filter = filter.add_directive(Level::ERROR.into());
    } else {
        filter = filter.add_directive(Level::ERROR.into());
        filter = filter.add_directive(Level::WARN.into());
        filter = filter.add_directive(Level::INFO.into());
    }
    let appender = tracing_appender::rolling::daily("./logs", "watchmen.log");
    let (non_blocking_appender, _guard) = tracing_appender::non_blocking(appender);
    let subscriber = fmt::Subscriber::builder()
        .with_writer(non_blocking_appender)
        .with_env_filter(filter)
        .finish();
    tracing::subscriber::set_global_default(subscriber)
        .expect("failed to set tracing default subscriber");

    // ====================================================

    info!(
        "Watchmen daemon start by engines {:?}",
        config.watchmen.engines
    );

    tokio::spawn(async move {
        let _ = run_monitor(config.watchmen.interval).await;
    });

    engine::start(config, load).await;

    return Ok(());
}