#[macro_use] extern crate serde; #[macro_use] extern crate diesel; use actix_cors::Cors; use actix_web::{middleware::Logger, 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 error; mod handlers; mod image_service; mod models; mod repo; mod result; mod schema; mod types; #[actix_web::main] async fn main() -> Result<()> { // Init logging std::env::set_var("RUST_LOG", "actix_web=info"); env_logger::init(); // Init DB connection pool let manager = ConnectionManager::::new(&CONFIG.db_url); let pool = Pool::builder().build(manager)?; // Init application server let mut server = HttpServer::new(move || { // Init CORS policy let cors = Cors::permissive(); App::new() .data(pool.clone()) .wrap(cors) .wrap(Logger::default()) .service(handlers::hello) .service(handlers::get_products) .service(handlers::patch_product) .service(handlers::post_product) .service(handlers::post_photo) }); // 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?) }