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)]
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,
}
}
-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,
}
}
-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);
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;
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)?
}
}
+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,
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;
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()