Lines
91.67 %
Functions
20 %
use review_harvest::{server::create_app, server_config::ServerConfig};
use std::error::Error;
use std::path::Path;
fn read_config<P: AsRef<Path>>(config_file: P) -> Result<ServerConfig, Box<dyn Error>> {
let content = std::fs::read_to_string(config_file)?;
Ok(serde_json::from_str(&content)?)
}
#[tokio::main]
#[allow(dead_code)]
async fn main() -> Result<(), Box<dyn Error>> {
let mut args = std::env::args();
args.next();
let config_file = args
.next()
.unwrap_or_else(|| "server_config.json".to_string());
let config = read_config(&config_file)
.unwrap_or_else(|_| panic!("Could not read config {}.", config_file));
let app = create_app(config)?;
let listener = tokio::net::TcpListener::bind("0.0.0.0:8000").await.unwrap();
axum::serve(listener, app)
.with_graceful_shutdown(shutdown_signal())
.await?;
println!("shutting down");
Ok(())
async fn shutdown_signal() {
let ctrl_c = async {
tokio::signal::ctrl_c()
.await
.expect("failed to install Ctrl+C handler");
};
#[cfg(unix)]
let terminate = async {
tokio::signal::unix::signal(tokio::signal::unix::SignalKind::terminate())
.expect("failed to install signal handler")
.recv()
.await;
#[cfg(not(unix))]
let terminate = std::future::pending::<()>();
tokio::select! {
_ = ctrl_c => {},
_ = terminate => {},