atagen

vineyard

public
Star0
Watch0
25d14e49ab6861630869e2129d40652900bc5833
1
ssh://brewery@pls.lobotomise.me:33/atagen/vineyard.git

Blame: src/main.rs

25d14e49ab68atagen2026-09-24 11:07 UTC1
use std::io::{Write as _, stdout};
25d14e49ab68atagen2026-09-24 11:07 UTC2
use std::path::PathBuf;
25d14e49ab68atagen2026-09-24 11:07 UTC3
25d14e49ab68atagen2026-09-24 11:07 UTC4
use anyhow::Context as _;
25d14e49ab68atagen2026-09-24 11:07 UTC5
use clap::{Parser, Subcommand};
25d14e49ab68atagen2026-09-24 11:07 UTC6
use tokio::signal::ctrl_c;
25d14e49ab68atagen2026-09-24 11:07 UTC7
#[cfg(unix)]
25d14e49ab68atagen2026-09-24 11:07 UTC8
use tokio::signal::unix::{SignalKind, signal};
25d14e49ab68atagen2026-09-24 11:07 UTC9
use vineyard::config::Config;
25d14e49ab68atagen2026-09-24 11:07 UTC10
use vineyard::server::spawn;
25d14e49ab68atagen2026-09-24 11:07 UTC11
25d14e49ab68atagen2026-09-24 11:07 UTC12
#[derive(Parser)]
25d14e49ab68atagen2026-09-24 11:07 UTC13
#[command(version, about = "a persistent nostr relay for git forges")]
25d14e49ab68atagen2026-09-24 11:07 UTC14
struct Cli {
25d14e49ab68atagen2026-09-24 11:07 UTC15
    #[command(subcommand)]
25d14e49ab68atagen2026-09-24 11:07 UTC16
    command: Command,
25d14e49ab68atagen2026-09-24 11:07 UTC17
}
25d14e49ab68atagen2026-09-24 11:07 UTC18
25d14e49ab68atagen2026-09-24 11:07 UTC19
#[derive(Subcommand)]
25d14e49ab68atagen2026-09-24 11:07 UTC20
enum Command {
25d14e49ab68atagen2026-09-24 11:07 UTC21
    Serve {
25d14e49ab68atagen2026-09-24 11:07 UTC22
        #[arg(long, default_value = "vineyard.toml")]
25d14e49ab68atagen2026-09-24 11:07 UTC23
        config: PathBuf,
25d14e49ab68atagen2026-09-24 11:07 UTC24
    },
25d14e49ab68atagen2026-09-24 11:07 UTC25
    CheckConfig {
25d14e49ab68atagen2026-09-24 11:07 UTC26
        #[arg(long, default_value = "vineyard.toml")]
25d14e49ab68atagen2026-09-24 11:07 UTC27
        config: PathBuf,
25d14e49ab68atagen2026-09-24 11:07 UTC28
    },
25d14e49ab68atagen2026-09-24 11:07 UTC29
}
25d14e49ab68atagen2026-09-24 11:07 UTC30
25d14e49ab68atagen2026-09-24 11:07 UTC31
#[tokio::main(worker_threads = 2)]
25d14e49ab68atagen2026-09-24 11:07 UTC32
async fn main() -> anyhow::Result<()> {
25d14e49ab68atagen2026-09-24 11:07 UTC33
    tracing_subscriber::fmt()
25d14e49ab68atagen2026-09-24 11:07 UTC34
        .with_env_filter(
25d14e49ab68atagen2026-09-24 11:07 UTC35
            tracing_subscriber::EnvFilter::try_from_default_env()
25d14e49ab68atagen2026-09-24 11:07 UTC36
                .unwrap_or_else(|_| "vineyard=info".into()),
25d14e49ab68atagen2026-09-24 11:07 UTC37
        )
25d14e49ab68atagen2026-09-24 11:07 UTC38
        .init();
25d14e49ab68atagen2026-09-24 11:07 UTC39
    match Cli::parse().command {
25d14e49ab68atagen2026-09-24 11:07 UTC40
        Command::CheckConfig { config } => {
25d14e49ab68atagen2026-09-24 11:07 UTC41
            Config::load(&config)?;
25d14e49ab68atagen2026-09-24 11:07 UTC42
            writeln!(stdout().lock(), "configuration is valid")?;
25d14e49ab68atagen2026-09-24 11:07 UTC43
        }
25d14e49ab68atagen2026-09-24 11:07 UTC44
        Command::Serve { config } => {
25d14e49ab68atagen2026-09-24 11:07 UTC45
            let relay = spawn(Config::load(&config)?).await?;
25d14e49ab68atagen2026-09-24 11:07 UTC46
            #[cfg(unix)]
25d14e49ab68atagen2026-09-24 11:07 UTC47
            {
25d14e49ab68atagen2026-09-24 11:07 UTC48
                let mut terminate =
25d14e49ab68atagen2026-09-24 11:07 UTC49
                    signal(SignalKind::terminate()).context("installing termination handler")?;
25d14e49ab68atagen2026-09-24 11:07 UTC50
                tokio::select! {
25d14e49ab68atagen2026-09-24 11:07 UTC51
                    result = ctrl_c() => result?,
25d14e49ab68atagen2026-09-24 11:07 UTC52
                    _ = terminate.recv() => {},
25d14e49ab68atagen2026-09-24 11:07 UTC53
                }
25d14e49ab68atagen2026-09-24 11:07 UTC54
            }
25d14e49ab68atagen2026-09-24 11:07 UTC55
            #[cfg(not(unix))]
25d14e49ab68atagen2026-09-24 11:07 UTC56
            ctrl_c().await?;
25d14e49ab68atagen2026-09-24 11:07 UTC57
            relay.shutdown().await?;
25d14e49ab68atagen2026-09-24 11:07 UTC58
        }
25d14e49ab68atagen2026-09-24 11:07 UTC59
    }
25d14e49ab68atagen2026-09-24 11:07 UTC60
    Ok(())
25d14e49ab68atagen2026-09-24 11:07 UTC61
}