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
)
}