pipey 0.2.1

A lightweight HTTP-to-WebSocket event delivery service.
Documentation
use crate::configs::{ServerConfig, cors_config, init_tracing, routes_config};
use crate::handlers::page_not_found;
use crate::models::AppState;
use crate::utils::init_check_env;
use actix_web::{App, HttpServer, dev::Server, middleware::Logger, web};
use tracing::info;
use tracing_actix_web::TracingLogger;

#[derive(Clone, Default)]
pub struct Pipey;

impl Pipey {
    pub async fn run_server() -> Result<(Server, web::Data<AppState>), std::io::Error> {
        dotenvy::dotenv().ok();
        init_tracing();
        init_check_env();

        let redis_url = std::env::var("REDIS_URL").expect("Missing env variable REDIS_URL");
        let node_id = std::env::var("SERVER_NODE_ID").expect("Missing env variable SERVER_NODE_ID");
        let server_cfg = ServerConfig::from_env();
        let app_state = web::Data::new(AppState::new(&node_id, &redis_url).await);

        let server = HttpServer::new({
            let app_state = app_state.clone();

            move || {
                App::new()
                    .app_data(app_state.clone())
                    .wrap(cors_config())
                    .wrap(Logger::new("%r\" %s %b %Dms \"%{User-Agent}i\""))
                    .wrap(TracingLogger::default())
                    .configure(routes_config)
                    .default_service(web::route().to(page_not_found))
            }
        })
        .bind((server_cfg.host.clone(), server_cfg.port))?
        .run();

        info!(host = %server_cfg.host, port = server_cfg.port, "server starting");

        Ok((server, app_state))
    }
}