Skip to content
use actix_web::dev::Service;
use actix_web::http::header::{CACHE_CONTROL, HeaderValue};
use actix_web::{App, HttpResponse, HttpServer, Responder, get};
use env_logger::Env;
use log::info;

mod assets;
mod constants;
mod view;

#[get("/health")]
async fn health() -> impl Responder {
    HttpResponse::Ok()
}

#[get("/up")]
async fn up() -> impl Responder {
    HttpResponse::Ok().finish()
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    let port: u16 = std::env::var("PORT")
        .ok()
        .and_then(|p| p.parse().ok())
        .unwrap_or(80);

    let log_level = std::env::var("LOG_LEVEL").unwrap_or_else(|_| "info".to_string());
    let log_filter = log_level.to_string();
    let cache_control = HeaderValue::from_str(assets::cache_control_value())
        .map_err(|error| std::io::Error::new(std::io::ErrorKind::InvalidInput, error))?;
    env_logger::Builder::from_env(Env::default().default_filter_or(log_filter)).init();

    info!("{}", ascii_art(port));

    HttpServer::new(move || {
        let cache_control = cache_control.clone();

        App::new()
            .wrap_fn(move |req, service| {
                let response = service.call(req);
                let cache_control = cache_control.clone();

                async move {
                    let mut response = response.await?;
                    response.headers_mut().insert(CACHE_CONTROL, cache_control);
                    Ok(response)
                }
            })
            .service(health)
            .service(up)
            .service(assets::assets)
            .service(view::index::index)
            .service(view::about::about)
            .service(view::contact::contact)
    })
    .bind(("0.0.0.0", port))?
    .run()
    .await
}

fn ascii_art(port: u16) -> String {
    let url = format!("http://localhost:{}", port);
    let version = env!("CARGO_PKG_VERSION");
    format!(
        r#"
    ┌─────────────────────────────────┐
    │  ███╗   ███╗███████╗            │
    │  ████╗ ████║██╔════╝            │
    │  ██╔████╔██║█████╗              │
    │  ██║╚██╔╝██║██╔══╝              │
    │  ██║ ╚═╝ ██║███████╗            │
    │  ╚═╝     ╚═╝╚══════╝            │
    │                                 │
    │  Personal Page Server           │
    └─────────────────────────────────┘

    Server running at: {}
    Version: {}
    "#,
        url, version
    )
}