From 46d957df6442460e6d04bdb6888a55606de5bf7e Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Wed, 10 Jun 2020 23:09:02 +0100 Subject: [PATCH] wip misc --- src/gamestate.rs | 6 +++++- src/global.rs | 32 ++++++++++++++++++++++++-------- src/instance.rs | 1 + src/main.rs | 15 +++++++++++++-- src/pieces.rs | 6 +++++- src/testload.rs | 20 ++++++++++++++++++++ 6 files changed, 68 insertions(+), 12 deletions(-) create mode 100644 src/testload.rs diff --git a/src/gamestate.rs b/src/gamestate.rs index 20fdd4e6..90e61493 100644 --- a/src/gamestate.rs +++ b/src/gamestate.rs @@ -1,3 +1,4 @@ + pub trait Piece { fn svg(&self, pr : &PiecedRecord) -> SvgData; } @@ -9,11 +10,14 @@ pub struct PieceRecord { held : Option, } +struct PlayerRecord { + nick : String, +} #[derive(Debug)] pub struct GameState { pub pieces : Vec>, - pub players : Vec>, + pub players : Vec, } pub struct GameRef (InstanceGuard); diff --git a/src/global.rs b/src/global.rs index 33f37963..57210a80 100644 --- a/src/global.rs +++ b/src/global.rs @@ -1,7 +1,12 @@ +strut InstanceAccess { + inst : Rc, + user : usize, +} + #[derive(Default)] struct Global { - instances : RwLock>>, + tokens : RwLock, // xxx delete instances at some point! } @@ -9,21 +14,21 @@ lazy_static! { static ref GLOBAL : Global = Default::default(); } -fn lookup_instance(name : &str) -> Option> { - GLOBAL.instances().read().get(name) +fn lookup_token(s : &str) -> Option { + GLOBAL.instances().read().get(s) } - -#[throws(TE)] -fn create_instance(name : &str, i : Rc) { + +#[throws(E)] +fn create_instance_access(name : &str, i : Rc) { let w = GLOBAL.instances().write(); match w.entry(name) { - Occupied(oe) => throw!(TE::InstanceAlreadyExists); + Occupied(oe) => throw!(anyhow!("access key alreay defined")); Vacant(ve) => ve.insert(i); } } +/* impl<'r> FromParam<'r> for InstanceGuard<'r> { - // xxx any additional auth should go here type Error = AE; #[throws(E)] fn from_param(param: &'r RawStr) -> Self { @@ -34,4 +39,15 @@ impl<'r> FromParam<'r> for InstanceGuard<'r> { i.lock(iname) } } +*/ + +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/instance.rs b/src/instance.rs index 0118dfcb..ea2e6067 100644 --- a/src/instance.rs +++ b/src/instance.rs @@ -3,6 +3,7 @@ const RECENT_BUFFER : usize = 10; #[derive(Debug)] pub struct Instance { + mod_token : RawToken, g : RwLock, g_notify : Condvar, } diff --git a/src/main.rs b/src/main.rs index 5bfbde91..3a224773 100644 --- a/src/main.rs +++ b/src/main.rs @@ -55,8 +55,16 @@ impl Read for TestCounterInner { } } -#[get("/")] -fn updates() -> impl response::Responder<'static> { +struct MainRenderContext { }; + +#[post("/")] +fn mainpage(access : InstanceAccess) -> impl response::Responder<'static> { + let c = MainRenderContext { }; + Template::render("main",&c) +} + +/* + let tc = TestCounterInner { next : 0 }; let tc = BufReader::new(tc); let ch = response::Stream::chunked(tc, 1); @@ -64,6 +72,7 @@ fn updates() -> impl response::Responder<'static> { unwrap(); response::content::Content(ct,ch) } +*/ #[get("/_/")] fn resource(leaf : CheckedResourceLeaf) -> io::Result { @@ -72,6 +81,8 @@ fn resource(leaf : CheckedResourceLeaf) -> io::Result { } fn main() { + + let helmet = SpaceHelmet::default() .enable(NoSniff::Enable) .enable(Frame::Deny) diff --git a/src/pieces.rs b/src/pieces.rs index 0f6fa366..8d8da0a8 100644 --- a/src/pieces.rs +++ b/src/pieces.rs @@ -1,6 +1,6 @@ struct Disc { - colours : [Colour], + colours : Vec, size : Coord, } @@ -12,3 +12,7 @@ impl Piece for Disc { ).into_bytes() } } + +fn xxx_testload_disc() -> Disc { Disc { colours : + +} diff --git a/src/testload.rs b/src/testload.rs new file mode 100644 index 00000000..b37a61e2 --- /dev/null +++ b/src/testload.rs @@ -0,0 +1,20 @@ + +fn testload() -> E { + let disc = Disc { size : 10, colours : vec![ + Colour::literal("red"), + Colour::literal("pink"), + ] }; + let pr = PieceRecord { + pos : [40,40], + p : Rc::new(disc), + held : None, + }; + let g = GameState { + pieces : vec![ pr ], + players : vec![ + PlayerRecord { nick : "alice".to_owned() }, + PlayerRecord { nick : "bob" .to_owned() }, + ], + }; + create_instance_access("alice", + -- 2.30.2