chiark / gitweb /
it compiles again yay
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Wed, 30 Dec 2020 12:15:36 +0000 (12:15 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Wed, 30 Dec 2020 12:15:36 +0000 (12:15 +0000)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
daemon/api.rs
daemon/main.rs
daemon/session.rs
src/global.rs

index 37dab2f50232b16f721d50ea87124000adad19ee..06e8dbc3a0ca8b8bbbabd1e7780d29bf105eeb0b 100644 (file)
@@ -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<Self, Self::Error> {
-    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<Id::Error>
 {
-  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<O : ApiPieceOp> {
   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);
index f37236a472b145b577210703b1fae051ef2e883a..14b9544cc5de4bbb6ad1c7507972853bf0cda5b1 100644 (file)
@@ -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<String>,
 }
 #[get("/")]
-#[throws(OE)]
+#[throws(OER)]
 fn loading_p(ia: PlayerQueryString) -> Template {
   loading(None, ia)?
 }
 #[get("/<layout>")]
-#[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<T>
   }
 }
 
+pub struct Parse<T: FromStr>(pub T);
+
+impl<'r, T> FromParam<'r> for Parse<T>
+  where T: FromStr,
+        <T as FromStr>::Err : Debug,
+//  where  : Into<OE>
+{
+  type Error = <T as FromStr>::Err;
+  #[throws(Self::Error)]
+  fn from_param(param: &'r RawStr) -> Parse<T> {
+    Parse(param.as_str().parse()?)
+  }
+}
+
 #[get("/_/updates?<ctoken>&<gen>")]
 #[throws(OE)]
 fn updates<'r>(ctoken : InstanceAccess<ClientId>, gen: u64,
index db515a201d1e62ed5b5a499666500392956137dc..9cd70ce9d74021deb06a2dc4c75621e54b312dc8 100644 (file)
@@ -53,8 +53,16 @@ struct SessionForm {
   ptoken: RawToken,
 }
 #[post("/_/session/<layout>", format="json", data="<form>")]
-fn session(form : Json<SessionForm>, layout: Option<PresentationLayout>)
-           -> Result<Template,OE> {
+#[throws(OER)]
+fn session(form: Json<SessionForm>,
+           layout: Option<Parse<PresentationLayout>>)
+           -> Template {
+  session_inner(form, layout.map(|pl| pl.0))?
+}
+
+fn session_inner(form : Json<SessionForm>,
+                 layout: Option<PresentationLayout>)
+                 -> Result<Template,OE> {
   // make session in this game, log a message to other players
   let iad = lookup_token(form.ptoken.borrow())?;
   let player = iad.ident;
index 46aecdba780d3ba1eed7bc4b4e4d1aa503f1bf13..2c5cc46255f8758f5982f93e2efe0088c374012d 100644 (file)
@@ -454,7 +454,7 @@ impl<Id> InstanceAccessDetails<Id>
   where Id: AccessId, OE: From<Id::Error>
 {
   #[throws(OE)]
-  pub fn from_token(token: &RawToken) -> InstanceAccessDetails<Id> {
+  pub fn from_token(token: &RawTokenVal) -> InstanceAccessDetails<Id> {
     let g = Id::global_tokens(PRIVATE_Y).read().unwrap();
     let i = g.get(token).ok_or(Id::ERROR)?;
     i.clone()