cala_server/cli/
mod.rs

1pub mod config;
2mod db;
3
4use anyhow::Context;
5use clap::Parser;
6use std::{fs, path::PathBuf};
7
8use self::config::{Config, EnvOverride};
9use crate::{extension::*, job::JobRegistry};
10
11#[derive(Parser)]
12#[clap(version, long_about = None)]
13struct Cli {
14    #[clap(short, long, env = "CALA_CONFIG", value_name = "FILE")]
15    config: Option<PathBuf>,
16    #[clap(
17        long,
18        env = "CALA_HOME",
19        default_value = ".cala",
20        value_name = "DIRECTORY"
21    )]
22    cala_home: String,
23    #[clap(env = "PG_CON")]
24    pg_con: String,
25}
26
27pub async fn run<Q: QueryExtensionMarker, M: MutationExtensionMarker>(
28    job_registration: impl FnOnce(&mut JobRegistry),
29) -> anyhow::Result<()> {
30    let cli = Cli::parse();
31
32    let config = Config::load_config(cli.config, EnvOverride { db_con: cli.pg_con })?;
33
34    run_cmd::<Q, M>(&cli.cala_home, config, job_registration).await?;
35
36    Ok(())
37}
38
39async fn run_cmd<Q: QueryExtensionMarker, M: MutationExtensionMarker>(
40    cala_home: &str,
41    config: Config,
42    job_registration: impl FnOnce(&mut JobRegistry),
43) -> anyhow::Result<()> {
44    use cala_ledger::{CalaLedger, CalaLedgerConfig};
45    cala_tracing::init_tracer(config.tracing)?;
46    store_server_pid(cala_home, std::process::id())?;
47    let pool = db::init_pool(&config.db).await?;
48    let ledger_config = CalaLedgerConfig::builder().pool(pool.clone()).build()?;
49    let ledger = CalaLedger::init(ledger_config).await?;
50    let mut registry = JobRegistry::new(&ledger);
51    job_registration(&mut registry);
52    let app = crate::app::CalaApp::run(pool, config.app, ledger, registry).await?;
53    crate::server::run::<Q, M>(config.server, app).await?;
54    Ok(())
55}
56
57pub fn store_server_pid(cala_home: &str, pid: u32) -> anyhow::Result<()> {
58    create_cala_dir(cala_home)?;
59    let _ = fs::remove_file(format!("{cala_home}/server-pid"));
60    fs::write(format!("{cala_home}/server-pid"), pid.to_string()).context("Writing PID file")?;
61    Ok(())
62}
63
64fn create_cala_dir(cala_home: &str) -> anyhow::Result<()> {
65    let _ = fs::create_dir(cala_home);
66    Ok(())
67}