aboutsummaryrefslogtreecommitdiffstats
path: root/crates/turtle/src/command/client/server.rs
blob: 7de2755152248394dbb51185bb0cd9ff1283960a (plain) (blame)
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
58
59
60
61
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 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 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::<Postgres>(settings, addr).await,
                    DbType::Sqlite => launch::<Sqlite>(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(())
            }
        }
    }
}