1
use review_harvest::{server::create_app, server_config::ServerConfig};
2
use std::error::Error;
3
use std::path::Path;
4

            
5
2
fn read_config<P: AsRef<Path>>(config_file: P) -> Result<ServerConfig, Box<dyn Error>> {
6
2
    let content = std::fs::read_to_string(config_file)?;
7
2
    Ok(serde_json::from_str(&content)?)
8
2
}
9

            
10
#[tokio::main]
11
#[allow(dead_code)]
12
2
async fn main() -> Result<(), Box<dyn Error>> {
13
2
    let mut args = std::env::args();
14
2
    args.next();
15
2
    let config_file = args
16
2
        .next()
17
2
        .unwrap_or_else(|| "server_config.json".to_string());
18
2
    let config = read_config(&config_file)
19
2
        .unwrap_or_else(|_| panic!("Could not read config {}.", config_file));
20
2
    let app = create_app(config)?;
21

            
22
2
    let listener = tokio::net::TcpListener::bind("0.0.0.0:8000").await.unwrap();
23
2
    axum::serve(listener, app)
24
2
        .with_graceful_shutdown(shutdown_signal())
25
2
        .await?;
26
2
    println!("shutting down");
27
2
    Ok(())
28
}
29

            
30
2
async fn shutdown_signal() {
31
2
    let ctrl_c = async {
32
2
        tokio::signal::ctrl_c()
33
            .await
34
            .expect("failed to install Ctrl+C handler");
35
    };
36

            
37
    #[cfg(unix)]
38
2
    let terminate = async {
39
2
        tokio::signal::unix::signal(tokio::signal::unix::SignalKind::terminate())
40
2
            .expect("failed to install signal handler")
41
2
            .recv()
42
2
            .await;
43
2
    };
44

            
45
    #[cfg(not(unix))]
46
    let terminate = std::future::pending::<()>();
47

            
48
2
    tokio::select! {
49
4
        _ = ctrl_c => {},
50
4
        _ = terminate => {},
51
4
    }
52
2
}