use hyper::server::conn::http1; use hyper::service::service_fn; use hyper_util::rt::TokioIo; use sqlx::sqlite::SqlitePool; use tokio::net::TcpListener; #[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() -> Result<(), Box> { 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 listener = TcpListener::bind(config.socket_address).await?; info!("Starting server at {}", config.socket_address); loop { let config = config.clone(); let pool = pool.clone(); let assets = assets.clone(); let templates = templates.clone(); let (stream, _) = listener.accept().await?; let io = TokioIo::new(stream); tokio::task::spawn(async move { if let Err(err) = http1::Builder::new() .serve_connection( io, service_fn(move |req| { routes::routes( config.clone(), pool.clone(), assets.clone(), templates.clone(), req, ) }), ) .await { println!("Error serving connection: {:?}", err); } }); } }