use hyper::service::{make_service_fn, service_fn}; use hyper::Server; use sqlx::sqlite::SqlitePool; use std::convert::Infallible; #[macro_use] extern crate log; mod assets; mod controller; mod crypto; mod db; mod jobs; mod mail; mod model; mod payer; mod queries; mod routes; mod templates; mod utils; mod validation; use model::config; #[tokio::main] async fn main() { env_logger::Builder::from_env( env_logger::Env::default().default_filter_or("warn"), ) .init(); let config = config::from_env() .unwrap_or_else(|err| panic!("Error reading config: {err}")); let pool = SqlitePool::connect(&format!("sqlite:{}", config.db_path)) .await .unwrap(); let assets = assets::get(); let templates = templates::get(); tokio::spawn(jobs::start(config.clone(), pool.clone(), templates.clone())); let make_svc = make_service_fn(|_conn| { let config = config.clone(); let pool = pool.clone(); let assets = assets.clone(); let templates = templates.clone(); async move { Ok::<_, Infallible>(service_fn(move |req| { routes::routes( config.clone(), pool.clone(), assets.clone(), templates.clone(), req, ) })) } }); info!("Starting server at {}", config.socket_address); if let Err(e) = Server::bind(&config.socket_address).serve(make_svc).await { error!("server error: {}", e); } }