From: Ian Jackson Date: Fri, 27 Nov 2020 19:44:48 +0000 (+0000) Subject: look up player (!) X-Git-Tag: otter-0.2.0~339 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=2bbda7dbf969d68896c513be805dc59936e7b113;p=otter.git look up player (!) Signed-off-by: Ian Jackson --- diff --git a/src/api.rs b/src/api.rs index 44dddf9d..cbb48b43 100644 --- a/src/api.rs +++ b/src/api.rs @@ -134,13 +134,10 @@ impl Lens for TransparentLens { fn massage_prep_piecestate(&self, _ns : &mut PreparedPieceState) { } } -impl<'r> Responder<'r> for OnlineError { - #[throws(Status)] - fn respond_to(self, req: &Request) -> Response<'r> { - let msg = format!("Online-layer error\n{:?}\n{}\n", self, self); - use rocket::http::Status; +impl From<&OnlineError> for rocket::http::Status { + fn from(oe: &OnlineError) -> rocket::http::Status { use OnlineError::*; - let status = match self { + match oe { ServerFailure(_) => Status::InternalServerError, NoClient | NoPlayer(_) | GameBeingDestroyed => Status::NotFound, @@ -148,7 +145,15 @@ impl<'r> Responder<'r> for OnlineError { => Status::Conflict, InvalidZCoord | BadOperation | BadJSON(_) => Status::BadRequest, - }; + } + } +} + +impl<'r> Responder<'r> for OnlineError { + #[throws(Status)] + fn respond_to(self, req: &Request) -> Response<'r> { + let msg = format!("Online-layer error\n{:?}\n{}\n", self, self); + let status = (&self).into(); let mut resp = Responder::respond_to(msg,req).unwrap(); resp.set_status(status); resp diff --git a/src/bin/daemon-otter.rs b/src/bin/daemon-otter.rs index 78da71be..e743b1c7 100644 --- a/src/bin/daemon-otter.rs +++ b/src/bin/daemon-otter.rs @@ -55,6 +55,8 @@ impl<'r> FromParam<'r> for CheckedResourceLeaf { } } +type PlayerQueryString<'r> = WholeQueryString>; + #[derive(Serialize,Debug)] struct LoadingRenderContext<'r> { ptoken: &'r RawTokenVal, @@ -62,25 +64,28 @@ struct LoadingRenderContext<'r> { } #[get("/")] #[throws(OE)] -fn loading_p(ptoken: WholeQueryString) -> Template { - loading(None, ptoken)? +fn loading_p(ia: PlayerQueryString) -> Template { + loading(None, ia)? } // xxx also do p, make it an account/player property #[get("/")] #[throws(OE)] -fn loading_l(layout: AbbrevPresentationLayout, ptoken: WholeQueryString) +fn loading_l(layout: AbbrevPresentationLayout, ia: PlayerQueryString) -> Template { - loading(Some(layout.0), ptoken)? + loading(Some(layout.0), ia)? } #[throws(OE)] -fn loading(layout: Option, ptoken: WholeQueryString) +fn loading(layout: Option, ia: PlayerQueryString) -> Template { - if let Some(ptoken) = ptoken.0 { + if let Some(ia) = ia.0 { + let g = ia.i.gref.lock()?; + let gpl = g.gs.players.byid(ia.i.ident)?; + let layout = layout.unwrap_or(gpl.layout); // xxx do something sensible if token mangled let c = LoadingRenderContext { - ptoken: RawTokenVal::from_str(ptoken), + ptoken: &ia.raw_token, layout, }; Template::render("loading",&c) @@ -90,14 +95,25 @@ fn loading(layout: Option, ptoken: WholeQueryString) } } -struct WholeQueryString<'r>(pub Option<&'r str>); +struct WholeQueryString(pub Option); -impl<'a,'r> FromRequest<'a,'r> for WholeQueryString<'a> { - type Error = Impossible; - fn from_request(r: &'a rocket::Request<'r>) -> rocket::Outcome>::Error), ()> { +impl<'a,'r,T> FromRequest<'a,'r> for WholeQueryString + where T: 'a + FromFormValue<'a>, + >::Error : Debug, + for <'x> &'x >::Error : Into, +{ + type Error = >::Error; + fn from_request(r: &'a rocket::Request<'r>) + -> rocket::Outcome + { eprintln!("REQUEST uri={:?}", &r.uri()); - let q = r.uri().query(); - rocket::Outcome::Success(WholeQueryString(q)) + match r.uri().query().map(|s| { + let s = RawStr::from_str(s); + FromFormValue::from_form_value(s) + }).transpose() { + Ok(v) => rocket::Outcome::Success(WholeQueryString(v)), + Err(e) => rocket::Outcome::Failure(((&e).into(), e)), + } } }