use clap::Parser;
use feox_server::{Config, Server};
use std::sync::Arc;
use tracing::{error, info};
#[derive(Parser, Debug)]
#[command(author, version, about, long_about = None)]
struct Args {
#[arg(short, long, default_value_t = 6379)]
port: u16,
#[arg(short, long, default_value = "127.0.0.1")]
bind: String,
#[arg(short = 't', long, default_value_t = 0)]
threads: usize,
#[arg(short = 'd', long)]
data_path: Option<String>,
#[arg(short, long)]
verbose: bool,
#[arg(short, long)]
config: Option<String>,
#[arg(long, default_value = "info")]
log_level: String,
}
fn main() -> anyhow::Result<()> {
let args = Args::parse();
let log_level = if args.verbose {
"debug"
} else {
&args.log_level
};
tracing_subscriber::fmt()
.with_env_filter(format!("feox_server={},feoxdb=info", log_level))
.init();
info!(
"Starting FeOx Server v{} on {}:{}",
env!("CARGO_PKG_VERSION"),
args.bind,
args.port
);
let num_cpus = num_cpus::get();
let threads = if args.threads == 0 {
num_cpus
} else {
args.threads
};
info!(
"Detected {} CPUs, using {} worker threads",
num_cpus, threads
);
let config = if let Some(config_path) = args.config {
Config::from_file(&config_path)?
} else {
Config {
bind_addr: args.bind,
port: args.port,
threads,
data_path: args.data_path,
..Default::default()
}
};
let server = Arc::new(Server::new(config)?);
let server_clone = Arc::clone(&server);
ctrlc::set_handler(move || {
info!("Received shutdown signal, shutting down gracefully...");
server_clone.shutdown();
})?;
if let Err(e) = server.run() {
error!("Server error: {}", e);
return Err(e.into());
}
info!("Server shutdown complete");
Ok(())
}