use clap::Parser; use config::AppConfig; use observability::build_logger; #[derive(Parser, Debug)] #[command(name = "gitserver")] #[command(version)] struct Args { #[arg(long, default_value = "info")] log_level: String, } #[tokio::main] async fn main() -> anyhow::Result<()> { let args = Args::parse(); let cfg = AppConfig::load(); let log = build_logger(&args.log_level); let http_handle = tokio::spawn(git::http::run_http(cfg.clone(), log.clone())); let ssh_handle = tokio::spawn(git::ssh::run_ssh(cfg, log.clone())); tokio::select! { result = http_handle => { match result { Ok(Ok(())) => slog::info!(log, "HTTP server stopped"), Ok(Err(e)) => slog::error!(log, "HTTP server error: {}", e), Err(e) => slog::error!(log, "HTTP server task panicked: {}", e), } } result = ssh_handle => { match result { Ok(Ok(())) => slog::info!(log, "SSH server stopped"), Ok(Err(e)) => slog::error!(log, "SSH server error: {}", e), Err(e) => slog::error!(log, "SSH server task panicked: {}", e), } } _ = tokio::signal::ctrl_c() => { slog::info!(log, "received shutdown signal"); } } slog::info!(log, "shutting down"); Ok(()) }