1
use review_harvest::annotation_server::{create_app, AnnotationServerConfig};
2
use std::error::Error;
3
use std::path::Path;
4

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

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

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

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

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

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

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