+#![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)]
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<UserId,User>,
clients : DenseSlotMap<ClientId,Client>,
}
#[derive(Clone)]
-struct InstanceAccess {
- i : Arc<Mutex<Instance>>,
- user : UserId,
+pub struct InstanceAccessDetails {
+ pub i : Arc<Mutex<Instance>>,
+ 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<HashMap<RawToken, InstanceAccess>>,
+ tokens : RwLock<HashMap<RawToken, InstanceAccessDetails>>,
// xxx delete instances at some point!
}
static ref GLOBAL : Global = Default::default();
}
-fn lookup_token(s : &str) -> Option<InstanceAccess> {
+fn lookup_token(s : &str) -> Option<InstanceAccessDetails> {
GLOBAL.tokens.read().unwrap().get(s).cloned()
}
("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(),
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
);
pub use thiserror::Error;
pub use anyhow::{Context,anyhow};
+pub use fehler::{throws,throw};
pub use serde::Deserialize;
pub use serde::Serialize;
pub use rocket::response;
pub use slotmap::dense::{DenseSlotMap};
+pub use crate::global::InstanceAccess;
pub type E = anyhow::Error;