diff --git a/daemon/src/maker.rs b/daemon/src/maker.rs index 9834123..4fd6240 100644 --- a/daemon/src/maker.rs +++ b/daemon/src/maker.rs @@ -18,6 +18,7 @@ mod keypair; mod maker_cfd_actor; mod maker_inc_connections_actor; mod model; +mod routes; mod routes_maker; mod seed; mod send_wire_message_actor; diff --git a/daemon/src/routes.rs b/daemon/src/routes.rs new file mode 100644 index 0000000..38f701d --- /dev/null +++ b/daemon/src/routes.rs @@ -0,0 +1,27 @@ +use rocket::http::{ContentType, Status}; +use rust_embed::EmbeddedFile; +use std::borrow::Cow; +use std::ffi::OsStr; +use std::path::PathBuf; + +pub trait EmbeddedFileExt { + fn into_response(self, file: PathBuf) -> Result<(ContentType, Cow<'static, [u8]>), Status>; +} + +impl EmbeddedFileExt for Option { + fn into_response(self, file: PathBuf) -> Result<(ContentType, Cow<'static, [u8]>), Status> { + match self { + None => Err(Status::NotFound), + Some(embedded_file) => { + let ext = file + .as_path() + .extension() + .and_then(OsStr::to_str) + .ok_or_else(|| Status::new(400))?; + let content_type = + ContentType::from_extension(ext).ok_or_else(|| Status::new(400))?; + Ok::<(ContentType, Cow<[u8]>), Status>((content_type, embedded_file.data)) + } + } + } +} diff --git a/daemon/src/routes_maker.rs b/daemon/src/routes_maker.rs index edc126c..9075fe7 100644 --- a/daemon/src/routes_maker.rs +++ b/daemon/src/routes_maker.rs @@ -1,9 +1,9 @@ use crate::maker_cfd_actor; use crate::model::cfd::{Cfd, Order, Origin}; use crate::model::{Usd, WalletInfo}; +use crate::routes::EmbeddedFileExt; use crate::to_sse_event::ToSseEvent; use anyhow::Result; - use rocket::http::{ContentType, Status}; use rocket::response::stream::EventStream; use rocket::response::{status, Responder}; @@ -11,7 +11,7 @@ use rocket::serde::json::Json; use rocket::State; use rust_embed::RustEmbed; use serde::Deserialize; -use std::ffi::OsStr; +use std::borrow::Cow; use std::path::PathBuf; use tokio::select; use tokio::sync::{mpsc, watch}; @@ -118,24 +118,11 @@ struct Asset; #[rocket::get("/assets/")] pub fn dist<'r>(file: PathBuf) -> impl Responder<'r, 'static> { let filename = format!("assets/{}", file.display().to_string()); - Asset::get(&filename).map_or_else( - || Err(Status::NotFound), - |d| { - let ext = file - .as_path() - .extension() - .and_then(OsStr::to_str) - .ok_or_else(|| Status::new(400))?; - let content_type = ContentType::from_extension(ext).ok_or_else(|| Status::new(400))?; - Ok((content_type, d.data)) - }, - ) + Asset::get(&filename).into_response(file) } -#[rocket::get("/<_paths..>")] +#[rocket::get("/<_paths..>", format = "text/html")] pub fn index<'r>(_paths: PathBuf) -> impl Responder<'r, 'static> { - Asset::get("index.html").map_or_else( - || Err(Status::NotFound), - |d| Ok((ContentType::HTML, d.data)), - ) + let asset = Asset::get("index.html").ok_or(Status::NotFound)?; + Ok::<(ContentType, Cow<[u8]>), Status>((ContentType::HTML, asset.data)) } diff --git a/daemon/src/routes_taker.rs b/daemon/src/routes_taker.rs index 4995a33..ec72de3 100644 --- a/daemon/src/routes_taker.rs +++ b/daemon/src/routes_taker.rs @@ -1,5 +1,6 @@ use crate::model::cfd::{calculate_buy_margin, Cfd, Order, OrderId}; use crate::model::{Leverage, Usd, WalletInfo}; +use crate::routes::EmbeddedFileExt; use crate::taker_cfd_actor; use crate::to_sse_event::ToSseEvent; use bdk::bitcoin::Amount; @@ -10,7 +11,7 @@ use rocket::serde::json::Json; use rocket::State; use rust_embed::RustEmbed; use serde::{Deserialize, Serialize}; -use std::ffi::OsStr; +use std::borrow::Cow; use std::path::PathBuf; use tokio::select; use tokio::sync::{mpsc, watch}; @@ -113,24 +114,11 @@ struct Asset; #[rocket::get("/assets/")] pub fn dist<'r>(file: PathBuf) -> impl Responder<'r, 'static> { let filename = format!("assets/{}", file.display().to_string()); - Asset::get(&filename).map_or_else( - || Err(Status::NotFound), - |d| { - let ext = file - .as_path() - .extension() - .and_then(OsStr::to_str) - .ok_or_else(|| Status::new(400))?; - let content_type = ContentType::from_extension(ext).ok_or_else(|| Status::new(400))?; - Ok((content_type, d.data)) - }, - ) + Asset::get(&filename).into_response(file) } -#[rocket::get("/<_paths..>")] +#[rocket::get("/<_paths..>", format = "text/html")] pub fn index<'r>(_paths: PathBuf) -> impl Responder<'r, 'static> { - Asset::get("index.html").map_or_else( - || Err(Status::NotFound), - |d| Ok((ContentType::HTML, d.data)), - ) + let asset = Asset::get("index.html").ok_or(Status::NotFound)?; + Ok::<(ContentType, Cow<[u8]>), Status>((ContentType::HTML, asset.data)) } diff --git a/daemon/src/taker.rs b/daemon/src/taker.rs index 177829b..fc3666e 100644 --- a/daemon/src/taker.rs +++ b/daemon/src/taker.rs @@ -18,6 +18,7 @@ use tokio::sync::watch; mod db; mod keypair; mod model; +mod routes; mod routes_taker; mod seed; mod send_wire_message_actor;