Newer
Older
use warp::{
http::HeaderValue,
hyper::{header::CONTENT_TYPE, Body},
path::FullPath,
reply, Filter,
};
async fn handle_request(
req: FullPath,
blog: Arc<RwLock<RenderedBlog>>,
) -> Result<impl warp::Reply, warp::Rejection> {
let blog = blog.read().await;
let (status, content) = blog.get(req.as_str());
let mut reply = reply::Response::new(Body::from(content.data));
reply
.headers_mut()
.insert(CONTENT_TYPE, HeaderValue::from_static(content.content_type));
*reply.status_mut() = status;
Ok(reply)
let config = Config::load().unwrap();
let blog: RenderedBlog =
Blog::new(config.name, config.description, &PathBuf::from(config.path))
.unwrap()
.try_into()
.unwrap();
let blog = Arc::new(RwLock::new(blog));
let blog_filter = warp::any().map(move || blog.clone());
warp::serve(
warp::filters::path::full()
.and(blog_filter.clone())
.and_then(handle_request),
)
.run(([0, 0, 0, 0], 3030))
.await;
}