use std::path::PathBuf;
use std::process::ExitCode;
use clap::Parser;
use jammi_db::config::{JammiConfig, LogFormat};
use jammi_server::runtime::OssServer;
use tracing_subscriber::EnvFilter;
#[derive(Parser)]
#[command(
name = "jammi-server",
version,
about = "OSS Jammi server: Arrow Flight SQL, SessionService, TriggerService, and /healthz /readyz /metrics"
)]
struct Cli {
#[arg(long)]
config: Option<PathBuf>,
}
#[tokio::main]
async fn main() -> ExitCode {
let cli = Cli::parse();
let config = match JammiConfig::load(cli.config.as_deref()) {
Ok(cfg) => cfg,
Err(e) => {
eprintln!("jammi-server: failed to load config: {e}");
return ExitCode::FAILURE;
}
};
init_tracing(&config);
let server = match OssServer::new(config).await {
Ok(s) => s,
Err(e) => {
tracing::error!(error = %e, "failed to construct OSS server");
return ExitCode::FAILURE;
}
};
if let Err(e) = server.run().await {
tracing::error!(error = %e, "OSS server exited with error");
return ExitCode::FAILURE;
}
ExitCode::SUCCESS
}
fn init_tracing(config: &JammiConfig) {
let filter = EnvFilter::try_from_default_env()
.unwrap_or_else(|_| EnvFilter::new(config.logging.level.clone()));
match config.logging.format {
LogFormat::Json => {
tracing_subscriber::fmt()
.json()
.with_env_filter(filter)
.init();
}
LogFormat::Text => {
tracing_subscriber::fmt().with_env_filter(filter).init();
}
}
}