use std::net::SocketAddr; use crate::atuin_server::{Settings, launch, launch_metrics_server}; use crate::atuin_server_database::DbType; use crate::atuin_server_postgres::Postgres; use crate::atuin_server_sqlite::Sqlite; use clap::Subcommand; use eyre::{Context, Result, eyre}; #[derive(Subcommand, Clone, Debug)] #[command(infer_subcommands = true)] pub(crate) enum Cmd { /// Start the server Start { /// The host address to bind #[clap(long)] host: Option, /// The port to bind #[clap(long, short)] port: Option, }, /// Print server example configuration DefaultConfig, } impl Cmd { #[expect(clippy::too_many_lines)] pub(crate) async fn run(self) -> Result<()> { match self { Cmd::Start { host, port } => { let settings = Settings::new().wrap_err("could not load server settings")?; let host = host.as_ref().unwrap_or(&settings.host).clone(); let port = port.unwrap_or(settings.port); let addr = SocketAddr::new(host.parse()?, port); if settings.metrics.enable { tokio::spawn(launch_metrics_server( settings.metrics.host.clone(), settings.metrics.port, )); } match settings.db_settings.db_type() { DbType::Postgres => launch::(settings, addr).await, DbType::Sqlite => launch::(settings, addr).await, DbType::Unknown => { Err(eyre!("db_uri must start with postgres:// or sqlite://")) } } } Cmd::DefaultConfig => { // TODO(@bpeetz): Add this back <2026-06-11> println!("TODO"); Ok(()) } } } }