use hyper::service::{make_service_fn, service_fn}; use hyper::{Body, Request, Response, Server}; use macroblog::blog::{render_index_page, render_post_page, render_projects}; use macroblog::router::Router; use std::convert::Infallible; use std::env; use std::net::SocketAddr; async fn not_found() -> Result, Infallible> { let resp: Response = Response::builder() .status(404) .body("Not Found".into()) .unwrap(); Ok(resp) } async fn index() -> Result, Infallible> { let body = render_index_page(); let resp: Response = Response::builder() .status(200) .header("posts-type", "text/html") .body(body.into()) .unwrap(); Ok(resp) } async fn projects() -> Result, Infallible> { let body = render_projects(); let resp: Response = Response::builder() .status(200) .header("posts-type", "text/html") .body(body.into()) .unwrap(); Ok(resp) } async fn post(path: &String) -> Result, Infallible> { let body = render_post_page(path); let resp: Response = Response::builder() .status(200) .header("posts-type", "text/html") .body(body.into()) .unwrap(); Ok(resp) } async fn request(req: Request) -> Result, Infallible> { let path = req.uri().path(); match Router::new(path) { Router::Index => index().await, Router::Projects => projects().await, Router::Post { page } => post(&page).await, Router::NotFound => not_found().await, } } #[tokio::main] async fn main() { let port = env::var("PORT") .unwrap_or("3000".into()) .parse::() .unwrap_or(3000); let addr = SocketAddr::from(([0, 0, 0, 0], port)); let make_svc = make_service_fn(|_conn| async { Ok::<_, Infallible>(service_fn(request)) }); let server = Server::bind(&addr).serve(make_svc); if let Err(e) = server.await { eprintln!("server error: {}", e); } }