From: Ian Jackson Date: Sun, 21 Jun 2020 22:45:24 +0000 (+0100) Subject: compiles again X-Git-Tag: otter-0.2.0~1574 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=a86dd25b6ce9c2c0504e9810e9dd8da16a3d3cda;p=otter.git compiles again --- diff --git a/junk/global.rs b/junk/global.rs index 5872f437..009215cf 100644 --- a/junk/global.rs +++ b/junk/global.rs @@ -22,13 +22,3 @@ impl<'r> FromParam<'r> for InstanceGuard<'r> { } */ -impl<'r> FromParam<'r> for InstanceAccess<'r> { - type Error = AE; - #[throws(E)] - fn from_param(param: &'r RawStr) -> Option { - let g = GLOBAL.instances().read(); - let iname = param.as_str(); - g.get(iname); - } -} - diff --git a/src/bin/server.rs b/src/bin/server.rs index 7309e3a3..43a0d23f 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -35,6 +35,13 @@ impl<'r> FromParam<'r> for CheckedResourceLeaf { } } +#[get("/")] +fn loading(token : InstanceAccess) -> Result { + let _ = token; + let c = TestRenderContext { }; + Ok(Template::render("loading",&c)) +} + #[derive(Serialize)] enum Update { TestCounter { value: usize }, @@ -83,6 +90,7 @@ fn main() { .attach(Template::fairing()) .mount("/", routes![ index, + loading, resource, updates, ]) diff --git a/src/global.rs b/src/global.rs index 60f6a263..3733692b 100644 --- a/src/global.rs +++ b/src/global.rs @@ -1,10 +1,12 @@ +#![allow(dead_code)] + use crate::imports::*; use lazy_static::lazy_static; slotmap::new_key_type!{ - struct UserId; - struct ClientId; + pub struct UserId; + pub struct ClientId; } #[derive(Clone,Debug,Eq,PartialEq,Ord,PartialOrd,Hash)] @@ -13,30 +15,36 @@ impl Borrow for RawToken { fn borrow(&self) -> &str { &self.0 } } -struct Client { +pub struct Client { user : UserId, } -struct User { +pub struct User { nick : String, } -struct Instance { +pub struct Instance { /* game state goes here */ users : DenseSlotMap, clients : DenseSlotMap, } #[derive(Clone)] -struct InstanceAccess { - i : Arc>, - user : UserId, +pub struct InstanceAccessDetails { + pub i : Arc>, + pub user : UserId, +} + +#[derive(Clone)] +pub struct InstanceAccess<'i> { + pub raw_token : &'i str, + pub i : InstanceAccessDetails, } #[derive(Default)] struct Global { // lock hierarchy: this is the innermost lock - tokens : RwLock>, + tokens : RwLock>, // xxx delete instances at some point! } @@ -44,7 +52,7 @@ lazy_static! { static ref GLOBAL : Global = Default::default(); } -fn lookup_token(s : &str) -> Option { +fn lookup_token(s : &str) -> Option { GLOBAL.tokens.read().unwrap().get(s).cloned() } @@ -53,6 +61,17 @@ const XXX_USERS_TOKENS : &[(&str, &str)] = &[ ("ccg9kzoTh758QrVE1xMY7BQWB36dNJTx", "bob"), ]; +impl<'r> FromParam<'r> for InstanceAccess<'r> { + type Error = E; + #[throws(E)] + fn from_param(param: &'r RawStr) -> Self { + let g = GLOBAL.tokens.read().unwrap(); + let token = param.as_str(); + let i = g.get(token).ok_or_else(|| anyhow!("unknown token"))?; + InstanceAccess { raw_token : token, i : i.clone() } + } +} + pub fn xxx_global_setup() { let i = Instance { users : Default::default(), @@ -63,7 +82,7 @@ pub fn xxx_global_setup() { for (token, nick) in XXX_USERS_TOKENS { let nu = User { nick : nick.to_string() }; let user = ig.users.insert(nu); - let ia = InstanceAccess { i : i.clone(), user }; + let ia = InstanceAccessDetails { i : i.clone(), user }; GLOBAL.tokens.write().unwrap().insert( RawToken(token.to_string()), ia ); diff --git a/src/imports.rs b/src/imports.rs index 627abb36..f7a2171e 100644 --- a/src/imports.rs +++ b/src/imports.rs @@ -9,6 +9,7 @@ pub use std::borrow::Borrow; pub use thiserror::Error; pub use anyhow::{Context,anyhow}; +pub use fehler::{throws,throw}; pub use serde::Deserialize; pub use serde::Serialize; @@ -24,6 +25,7 @@ pub use rocket::response::NamedFile; pub use rocket::response; pub use slotmap::dense::{DenseSlotMap}; +pub use crate::global::InstanceAccess; pub type E = anyhow::Error;