use std::convert::Infallible; use std::{env}; use std::net::SocketAddr; use hyper::{Body, Request, Response, Server}; use hyper::service::{make_service_fn, service_fn}; use macroblog::router::Router; use macroblog::blog::{render_index_page, render_post_page}; 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 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::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); } }