From: Ian Jackson Date: Wed, 30 Dec 2020 12:15:36 +0000 (+0000) Subject: it compiles again yay X-Git-Tag: otter-0.2.0~73 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=8e31beda523590fb4d4a3a7c59f97d99aaa864ff;p=otter.git it compiles again yay Signed-off-by: Ian Jackson --- diff --git a/daemon/api.rs b/daemon/api.rs index 37dab2f5..06e8dbc3 100644 --- a/daemon/api.rs +++ b/daemon/api.rs @@ -10,15 +10,6 @@ type PL = PresentationLayout; pub struct AbbrevPresentationLayout(pub PresentationLayout); -/* -impl<'r> FromParam<'r> for PresentationLayout { - type Error = strum::ParseError; - fn from_param(param: &'r RawStr) -> Result { - param.as_str().parse() - } -} -*/ - impl<'r> FromParam<'r> for AbbrevPresentationLayout { type Error = (); #[throws(Self::Error)] @@ -40,16 +31,15 @@ pub struct InstanceAccess<'i, Id> { impl<'r, Id> FromFormValue<'r> for InstanceAccess<'r, Id> where Id : AccessId, OE : From { - type Error = OE; - #[throws(OE)] + type Error = OER; + #[throws(OER)] fn from_form_value(param: &'r RawStr) -> Self { let token = RawTokenVal::from_str(param.as_str()); - let i = InstanceAccessDetails::from_token(&token); + let i = InstanceAccessDetails::from_token(token)?; InstanceAccess { raw_token : token, i } } } - #[derive(Debug,Serialize,Deserialize)] struct ApiPiece { ctoken : RawToken, @@ -79,10 +69,14 @@ trait ApiPieceOp : Debug { } } -impl From<&OnlineError> for rocket::http::Status { - fn from(oe: &OnlineError) -> rocket::http::Status { +#[derive(Error,Debug)] +#[error("{0}")] +pub struct OnlineErrorResponse(#[from] OnlineError); + +impl From<&OnlineErrorResponse> for rocket::http::Status { + fn from(oe: &OnlineErrorResponse) -> rocket::http::Status { use OnlineError::*; - match oe { + match oe.0 { ServerFailure(_) => Status::InternalServerError, NoClient | NoPlayer(_) | GameBeingDestroyed => Status::NotFound, @@ -94,7 +88,7 @@ impl From<&OnlineError> for rocket::http::Status { } } -impl<'r> Responder<'r> for OnlineError { +impl<'r> Responder<'r> for OnlineErrorResponse { #[throws(Status)] fn respond_to(self, req: &Request) -> Response<'r> { let msg = format!("Online-layer error\n{:?}\n{}\n", self, self); diff --git a/daemon/main.rs b/daemon/main.rs index f37236a4..14b9544c 100644 --- a/daemon/main.rs +++ b/daemon/main.rs @@ -24,8 +24,11 @@ pub use rocket_contrib::templates::Engines; pub use rocket_contrib::templates::Template; pub use crate::api::{AbbrevPresentationLayout, InstanceAccess}; +pub use crate::api::{OnlineErrorResponse}; pub use crate::cmdlistener::*; +pub type OER = OnlineErrorResponse; + use rocket::fairing; use rocket::response::Content; use rocket_contrib::serve::StaticFiles; @@ -89,12 +92,12 @@ struct LoadingRenderContext<'r> { debug_js_inject: Arc, } #[get("/")] -#[throws(OE)] +#[throws(OER)] fn loading_p(ia: PlayerQueryString) -> Template { loading(None, ia)? } #[get("/")] -#[throws(OE)] +#[throws(OER)] fn loading_l(layout: AbbrevPresentationLayout, ia: PlayerQueryString) -> Template { loading(Some(layout.0), ia)? @@ -146,6 +149,20 @@ impl<'a,'r,T> FromRequest<'a,'r> for WholeQueryString } } +pub struct Parse(pub T); + +impl<'r, T> FromParam<'r> for Parse + where T: FromStr, + ::Err : Debug, +// where : Into +{ + type Error = ::Err; + #[throws(Self::Error)] + fn from_param(param: &'r RawStr) -> Parse { + Parse(param.as_str().parse()?) + } +} + #[get("/_/updates?&")] #[throws(OE)] fn updates<'r>(ctoken : InstanceAccess, gen: u64, diff --git a/daemon/session.rs b/daemon/session.rs index db515a20..9cd70ce9 100644 --- a/daemon/session.rs +++ b/daemon/session.rs @@ -53,8 +53,16 @@ struct SessionForm { ptoken: RawToken, } #[post("/_/session/", format="json", data="
")] -fn session(form : Json, layout: Option) - -> Result { +#[throws(OER)] +fn session(form: Json, + layout: Option>) + -> Template { + session_inner(form, layout.map(|pl| pl.0))? +} + +fn session_inner(form : Json, + layout: Option) + -> Result { // make session in this game, log a message to other players let iad = lookup_token(form.ptoken.borrow())?; let player = iad.ident; diff --git a/src/global.rs b/src/global.rs index 46aecdba..2c5cc462 100644 --- a/src/global.rs +++ b/src/global.rs @@ -454,7 +454,7 @@ impl InstanceAccessDetails where Id: AccessId, OE: From { #[throws(OE)] - pub fn from_token(token: &RawToken) -> InstanceAccessDetails { + pub fn from_token(token: &RawTokenVal) -> InstanceAccessDetails { let g = Id::global_tokens(PRIVATE_Y).read().unwrap(); let i = g.get(token).ok_or(Id::ERROR)?; i.clone()