mocra 0.4.1

A distributed, event-driven crawling and data collection framework
use std::path::Path;
use std::sync::Arc;
use tokio::signal;

use mocra::common::state::State;
use mocra::engine::engine::Engine;

#[tokio::main]
async fn main() {
    let config_path = Path::new("monitoring").join("local_engine.toml");
    let state = match State::try_new(config_path.to_str().expect("config path")).await {
        Ok(state) => Arc::new(state),
        Err(e) => {
            eprintln!("metrics_node failed to initialize state: {e}");
            std::process::exit(1);
        }
    };
    let engine = match Engine::new(Arc::clone(&state), None).await {
        Ok(e) => e,
        Err(e) => {
            eprintln!("metrics_node failed to initialize engine: {e}");
            std::process::exit(1);
        }
    };

    let start_fut = engine.start();
    tokio::pin!(start_fut);

    tokio::select! {
        res = &mut start_fut => {
            if let Err(e) = res {
                eprintln!("metrics_node engine failed to start: {e}");
                std::process::exit(1);
            }
        }
        _ = signal::ctrl_c() => {
            engine.shutdown().await;
            let _ = (&mut start_fut).await;
        }
    }
}