use anyhow::Context as _;
use clap::Parser;
use crabka_replicator::config::ReplicatorConfig;
use crabka_replicator::supervisor::FlowSupervisor;
use tracing_subscriber::layer::SubscriberExt as _;
use tracing_subscriber::util::SubscriberInitExt as _;
#[derive(Debug, Parser)]
#[command(name = "crabka-replicator", version, about)]
struct Cli {
#[arg(long, env = "CRABKA_REPLICATOR_CONFIG")]
config: std::path::PathBuf,
}
#[tokio::main(flavor = "multi_thread")]
async fn main() -> anyhow::Result<()> {
rustls::crypto::ring::default_provider()
.install_default()
.ok();
let filter = tracing_subscriber::EnvFilter::try_from_default_env()
.unwrap_or_else(|_| "crabka_replicator=info,info".into());
tracing_subscriber::registry()
.with(crabka_logfmt::layer(filter, std::io::stdout))
.init();
let cli = Cli::parse();
let yaml = std::fs::read_to_string(&cli.config)
.with_context(|| format!("reading config {}", cli.config.display()))?;
let config = ReplicatorConfig::from_yaml(&yaml)?;
config.validate()?;
let supervisor = FlowSupervisor::run(config).await?;
tracing::info!("crabka-replicator running; send SIGINT/ctrl-c to stop");
tokio::signal::ctrl_c().await?;
tracing::info!("shutdown requested; draining flows");
supervisor.shutdown().await;
Ok(())
}