use actix_web::{web, App, Error, HttpResponse, HttpServer}; use confik::{Configuration as _, EnvSource}; use deadpool_postgres::{Client, Pool}; use dotenvy::dotenv; use tokio_postgres::NoTls; use crate::config::ExampleConfig; mod config; mod db; mod errors; mod models; use self::{errors::MyError, models::User}; pub async fn get_users(db_pool: web::Data) -> Result { let client: Client = db_pool.get().await.map_err(MyError::PoolError)?; let users = db::get_users(&client).await?; Ok(HttpResponse::Ok().json(users)) } pub async fn add_user( user: web::Json, db_pool: web::Data, ) -> Result { let user_info: User = user.into_inner(); let client: Client = db_pool.get().await.map_err(MyError::PoolError)?; let new_user = db::add_user(&client, user_info).await?; Ok(HttpResponse::Ok().json(new_user)) } #[actix_web::main] async fn main() -> std::io::Result<()> { dotenv().ok(); let config = ExampleConfig::builder() .override_with(EnvSource::new()) .try_build() .unwrap(); let pool = config.pg.create_pool(None, NoTls).unwrap(); let server = HttpServer::new(move || { App::new().app_data(web::Data::new(pool.clone())).service( web::resource("/users") .route(web::post().to(add_user)) .route(web::get().to(get_users)), ) }) .bind(config.server_addr.clone())? .run(); println!("Server running at http://{}/", config.server_addr); server.await }