1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
use std::net::SocketAddr;
use crate::atuin_server::{Settings, database::DbType, launch, launch_metrics_server};
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<String>,
/// The port to bind
#[clap(long, short)]
port: Option<u16>,
},
/// 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::Unknown => {
Err(eyre!("db_uri must start with postgres:// or sqlite://"))
}
}
}
Cmd::DefaultConfig => {
// TODO(@bpeetz): Add this back <2026-06-11>
println!("TODO");
Ok(())
}
}
}
}
|