use std::path::PathBuf; use clap::Parser; use tranquil_gate::{App, config::Config, router}; mod telemetry; #[derive(Parser)] #[command(about = "Provision Tranquil delegated accounts for verified Tangled users")] struct Cli { #[arg(short, long, env = "GATE_CONFIG", value_name = "FILE")] config: Option, #[arg(long)] check_config: bool, } #[tokio::main] async fn main() -> anyhow::Result<()> { let cli = Cli::parse(); let config = Config::load(cli.config.as_deref())?; telemetry::init(&config.log)?; let app = App::new(&config)?; if cli.check_config { println!("configuration is valid"); return Ok(()); } let listener = tokio::net::TcpListener::bind(config.bind).await?; tracing::info!(address = %listener.local_addr()?, "tranquil-gate listening"); axum::serve(listener, router(app)) .with_graceful_shutdown(shutdown_signal()) .await?; Ok(()) } async fn shutdown_signal() { #[cfg(unix)] let terminate = async { tokio::signal::unix::signal(tokio::signal::unix::SignalKind::terminate()) .expect("install SIGTERM handler") .recv() .await; }; #[cfg(not(unix))] let terminate = std::future::pending::<()>(); tokio::select! { _ = tokio::signal::ctrl_c() => {}, _ = terminate => {}, } }