mod config; mod logging; mod server; use std::net::{Ipv6Addr, SocketAddr}; use clap::Parser; use tokio::net::TcpListener; use tracing::info; use crate::{config::Config, logging::initialise_logging, server::state::{AppState }}; #[tokio::main] async fn main() -> anyhow::Result<()> { let cli = config::Cli::parse(); let mut config: Config = if let Some(ref path) = cli.config { let contents = std::fs::read_to_string(path)?; toml::from_str(&contents)? } else { Default::default() }; config.merge_with_cli(&cli); initialise_logging(&config); let state = AppState::new(&config).await?; let router = server::router(&config, state).await?; let addr = SocketAddr::from((Ipv6Addr::UNSPECIFIED, config.server.port)); info!(port = addr.port(), "starting server"); let listener = TcpListener::bind(addr).await?; // Run the server with graceful shutdown axum::serve(listener, router) .with_graceful_shutdown(server::shutdown::shutdown_signal()) .await?; Ok(()) }