use actix_web::{web, App, Error, HttpRequest, HttpResponse, HttpServer, Responder}; use futures::future::{ready, Ready}; use listenfd::ListenFd; use serde::Serialize; #[derive(Serialize)] struct Product { id: u32, name: String, quantity: i32, cents: u32, img_path: String, description: String, } impl Responder for Product { type Error = Error; type Future = Ready>; fn respond_to(self, _req: &HttpRequest) -> Self::Future { let body = serde_json::to_string(&self).unwrap(); ready(Ok(HttpResponse::Ok() .content_type("application/json") .body(body))) } } async fn products() -> impl Responder { Product { id: 1, name: "Beach Box".to_string(), quantity: 3, cents: 1100, img_path: "/beach_box.jpg".to_string(), description: "It's a beach in a box".to_string(), } } async fn greet(req: HttpRequest) -> impl Responder { let name = req.match_info().get("name").unwrap_or("World"); format!("Hello {}!", &name) } async fn index() -> impl Responder { "Hello, this is an API. If you're looking for the web app, try the top-level domain at port 443.".to_string() } #[actix_rt::main] async fn main() -> std::io::Result<()> { let mut listenfd = ListenFd::from_env(); let mut server = HttpServer::new(|| { App::new() .route("/", web::get().to(index)) .route("/{name}", web::get().to(greet)) .route("/products", web::get().to(products)) }); server = if let Some(l) = listenfd.take_tcp_listener(0).unwrap() { server.listen(l)? } else { server.bind("127.0.0.1:8000")? }; server.run().await }