#[macro_use] extern crate diesel; #[macro_use] extern crate diesel_migrations; use std::str::FromStr; use anyhow::Context; use actix_web::{web, App, HttpServer, HttpResponse, Result}; mod db; mod model; mod schema; use crate::model::*; use crate::db::DbPool; embed_migrations!("migrations"); async fn create_person(db: web::Data, person: web::Json) -> Result { log::debug!("Creating person = {:?}", person); Ok(HttpResponse::Ok().finish()) } #[actix_web::main] async fn main() -> anyhow::Result<()> { env_logger::init_from_env(env_logger::Env::new().default_filter_or("info")); let bind = std::env::var("HOST").expect("environment: HOST variable not set"); let port = std::env::var("PORT") .as_ref() .map(|p| u16::from_str(p)) .expect("environment: PORT variable not set") .context("Failed to parse port as integer")?; let db_connection_pool = crate::db::establish_connection(); { let conn = db_connection_pool.get().expect("Failed to get connection from pool"); embedded_migrations::run_with_output(&conn, &mut std::io::stdout()); } // drop `conn` here HttpServer::new(move || { App::new() .data(db_connection_pool.clone()) .route("/create", web::post().to(create_person)) }) .bind(format!("{}:{}", bind, port))? .run() .await .map_err(anyhow::Error::from) }