blob: 11647903f7125efed8e3e6bbb5ca060c35c616c1 [file] [log] [blame] [edit]
use rust_embed::RustEmbed;
use warp::{http::header::HeaderValue, path::Tail, reply::Response, Filter, Rejection, Reply};
#[derive(RustEmbed)]
#[folder = "examples/public/"]
struct Asset;
#[tokio::main]
async fn main() {
let index_html = warp::path::end().and_then(serve_index);
let dist = warp::path("dist").and(warp::path::tail()).and_then(serve);
let routes = index_html.or(dist);
warp::serve(routes).run(([127, 0, 0, 1], 8080)).await;
}
async fn serve_index() -> Result<impl Reply, Rejection> {
serve_impl("index.html")
}
async fn serve(path: Tail) -> Result<impl Reply, Rejection> {
serve_impl(path.as_str())
}
fn serve_impl(path: &str) -> Result<impl Reply, Rejection> {
let asset = Asset::get(path).ok_or_else(warp::reject::not_found)?;
let mime = mime_guess::from_path(path).first_or_octet_stream();
let mut res = Response::new(asset.data.into());
res.headers_mut().insert("content-type", HeaderValue::from_str(mime.as_ref()).unwrap());
Ok(res)
}