use std::{ fs::{self, File}, io::{self, Write}, path::Path, }; use actix_files::Files; use actix_web::{web, App, HttpServer}; use glob::glob; use minify_html::{minify, Cfg}; mod config; #[path = "routes/index.rs"] mod index; #[path = "routes/not_found.rs"] mod not_found; #[path = "routes/agreements.rs"] mod agreements; #[actix_web::main] async fn main() -> io::Result<()> { let config = config::get_config("/config/config.toml"); let addr = ("127.0.0.1", config.port); println!("Listening to {}://{}:{}", config.scheme, addr.0, addr.1); let static_folder = "static"; let dist_folder = "dist"; // The static folder is minimized only in release mode let folder = if !cfg!(debug_assertions) { format!("{static_folder}/") } else { let cfg = Cfg::new(); for entry in glob(&format!("{static_folder}/**/*.*")).unwrap() { let path = entry.unwrap(); let data = fs::read_to_string(&path).unwrap(); let minified = minify(data.as_bytes(), &cfg); let path_with_dist = path.to_string_lossy().replace(static_folder, dist_folder); let new_path = Path::new(&path_with_dist); fs::create_dir_all(new_path.parent().unwrap()).unwrap(); let mut file = File::create(path_with_dist)?; file.write_all(&minified)?; } format!("{dist_folder}/") }; HttpServer::new(move || { App::new() .app_data(web::Data::new(config.clone())) .service(index::page) .service(Files::new("/", &folder)) .service(agreements::security) .service(agreements::humans) .service(agreements::robots) .service(agreements::sitemap) .default_service(web::to(not_found::page)) }) .bind(addr)? .run() .await }