Browse Source

Add ext trait to convert EmbeddedFile to Response

no-contract-setup-message
Philipp Hoenisch 3 years ago
parent
commit
28cc157cee
No known key found for this signature in database GPG Key ID: E5F8E74C672BC666
  1. 1
      daemon/src/maker.rs
  2. 27
      daemon/src/routes.rs
  3. 25
      daemon/src/routes_maker.rs
  4. 24
      daemon/src/routes_taker.rs
  5. 1
      daemon/src/taker.rs

1
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;

27
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<EmbeddedFile> {
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))
}
}
}
}

25
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/<file..>")]
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))
}

24
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/<file..>")]
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))
}

1
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;

Loading…
Cancel
Save