use clap::Parser;
use heliosdb_proxy::{config::ProxyConfig, server::ProxyServer, Result, VERSION};
use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt};
#[derive(Parser, Debug)]
#[command(name = "heliosdb-proxy")]
#[command(version = VERSION)]
#[command(about = "HeliosDB Proxy - Intelligent connection router for HeliosDB-Lite")]
struct Args {
#[arg(short, long)]
config: Option<String>,
#[arg(short, long, default_value = "0.0.0.0:5432")]
listen: String,
#[arg(long, default_value = "0.0.0.0:9090")]
admin: String,
#[arg(long)]
primary: Option<String>,
#[arg(long)]
standby: Vec<String>,
#[arg(long, default_value = "true")]
tr: bool,
#[arg(long, default_value = "info")]
log_level: String,
#[arg(long)]
json_logs: bool,
}
#[tokio::main]
async fn main() -> Result<()> {
let args = Args::parse();
init_logging(&args.log_level, args.json_logs);
tracing::info!("HeliosDB Proxy v{} starting...", VERSION);
let config = load_config(&args)?;
let server = ProxyServer::new(config)?;
tracing::info!("Starting proxy server on {}", args.listen);
server.run().await?;
tracing::info!("Proxy server stopped");
Ok(())
}
fn init_logging(level: &str, json: bool) {
let filter = tracing_subscriber::EnvFilter::try_from_default_env()
.unwrap_or_else(|_| tracing_subscriber::EnvFilter::new(level));
let subscriber = tracing_subscriber::registry().with(filter);
if json {
subscriber
.with(tracing_subscriber::fmt::layer().json())
.init();
} else {
subscriber
.with(tracing_subscriber::fmt::layer())
.init();
}
}
fn load_config(args: &Args) -> Result<ProxyConfig> {
if let Some(ref path) = args.config {
return ProxyConfig::from_file(path);
}
let mut config = ProxyConfig::default();
config.listen_address = args.listen.clone();
config.admin_address = args.admin.clone();
config.tr_enabled = args.tr;
if let Some(ref primary) = args.primary {
config.add_node(primary, "primary")?;
}
for standby in &args.standby {
config.add_node(standby, "standby")?;
}
config.validate()?;
Ok(config)
}