#[macro_use] extern crate serde; #[macro_use] extern crate diesel; use actix_web::{App, HttpServer}; use config::CONFIG_INSTANCE as CONFIG; use diesel::prelude::SqliteConnection; use diesel::r2d2::ConnectionManager; use diesel::r2d2::Pool; use listenfd::ListenFd; use result::Result; mod config; mod constants; mod dtos; mod entities; mod error; mod handlers; mod models; mod product_repo; mod result; mod schema; mod types; #[actix_web::main] async fn main() -> Result<()> { // Initialize DB connection pool. let manager = ConnectionManager::::new(&CONFIG.db_url); let pool = Pool::builder().build(manager)?; // Initialize application server. let mut server = HttpServer::new(move || { App::new() .data(pool.clone()) .service(handlers::hello) .service(handlers::get_products) .service(handlers::update_product) .service(handlers::create_product) }); // If using listenfd, bind to it instead of the configured address to allow for cargo watch // auto-reloading let mut listenfd = ListenFd::from_env(); server = if let Some(l) = listenfd .take_tcp_listener(0) .expect("Unable to grab TCP listener!") { server.listen(l)? } else { server.bind(CONFIG.bind_addr)? }; Ok(server.run().await?) }