diff options
Diffstat (limited to 'src/viewer/mod.rs')
-rw-r--r-- | src/viewer/mod.rs | 57 |
1 files changed, 42 insertions, 15 deletions
diff --git a/src/viewer/mod.rs b/src/viewer/mod.rs index 6ea540b..a411c29 100644 --- a/src/viewer/mod.rs +++ b/src/viewer/mod.rs @@ -1,28 +1,55 @@ -use std::net::SocketAddr; +use std::{convert::Infallible, net::SocketAddr, sync::Arc}; -use warp::Filter; +use warp::{hyper::StatusCode, Filter, Rejection, Reply}; -pub fn serve_http(bind: SocketAddr) { +use crate::{dimension::Dimension, render::Renderer, tiling::Tiler}; + +pub fn serve_http(dimension: Dimension, bind: SocketAddr) { tokio::runtime::Builder::new_multi_thread() .enable_all() .build() .unwrap() .block_on(async move { + let renderer = Renderer::new(dimension); + let tiler = Arc::new(Tiler::new(renderer)); + let tiler: _ = warp::any().map(move || tiler.clone()); + let tiles = warp::path!("tiles" / isize / isize / isize) - .map(|z, x, y| format!("blub {:?}", (x, y, z))); + .and(tiler.clone()) + .and_then(|z, x, y, tiler: Arc<Tiler>| async move { + Ok::<_, Infallible>(warp::reply::with_header( + tiler.get_tile(z, x, y), + "content-type", + "image/png", + )) + }); + + let viewer_html: _ = warp::path!().and(warp::fs::file("./src/viewer/viewer.html")); + let viewer_js: _ = + warp::path!("viewer.js").and(warp::fs::file("./src/viewer/viewer.js")); - // let dim = - // Dimension::new("/home/muffin/containers/games/home/user/server/world/region/"); - // let renderer = Renderer::new(dim); - // for sx in 0..2 { - // for sy in 0..2 { - // let view = renderer.render_segment(sx, sy); - // info!("saving png"); - // view.save(format!("/tmp/seg.{sx}.{sy}.png")).unwrap(); - // } - // } - let router = tiles; + let router: _ = tiles + .or(viewer_html) + .or(viewer_js) + .recover(handle_rejection); warp::serve(router).run(bind).await; }) } + +async fn handle_rejection(err: Rejection) -> Result<impl Reply, Infallible> { + let code; + let message; + if err.is_not_found() { + code = StatusCode::NOT_FOUND; + message = "Not found"; + } else if let Some(_) = err.find::<warp::reject::MethodNotAllowed>() { + code = StatusCode::METHOD_NOT_ALLOWED; + message = "Method not allowed"; + } else { + eprintln!("unhandled rejection: {:?}", err); + code = StatusCode::INTERNAL_SERVER_ERROR; + message = "Unhandled rejection :("; + } + Ok(warp::reply::with_status(message, code)) +} |