rnx 0.7.0

The Rust web development scaffold, support salvo and axum
use std::sync::Arc;

use infra::core::{config::config, AppState};
use tokio::signal::unix::{signal, SignalKind};

use crate::router;

pub async fn run(state: Arc<AppState>) {
    let addr = config().get_int("app.port").unwrap_or(8000);

    let listener = tokio::net::TcpListener::bind(format!("0.0.0.0:{}", addr))
        .await
        .unwrap();

    tracing::info!("listening on {}", addr);

    axum::serve(listener, router::init().with_state(state))
        .with_graceful_shutdown(shutdown_signal())
        .await
        .unwrap();
}

async fn shutdown_signal() {
    let mut sigint = signal(SignalKind::interrupt()).unwrap();
    let mut sigquit = signal(SignalKind::quit()).unwrap();
    let mut sigterm = signal(SignalKind::terminate()).unwrap();

    tokio::select! {
        _ = sigint.recv() => {
            println!("收到 SIGINT 信号,正在关闭服务...");
        }
        _ = sigquit.recv() => {
            println!("收到 SIGQUIT 信号,正在关闭服务...");
        }
        _ = sigterm.recv() => {
            println!("收到 SIGTERM 信号,正在关闭服务...");
        }
    }
}