aboutsummaryrefslogtreecommitdiff
path: root/src/viewer/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/viewer/mod.rs')
-rw-r--r--src/viewer/mod.rs57
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))
+}