diff --git a/secert-hitler/Cargo.lock b/secert-hitler/Cargo.lock index c637209..894de54 100644 --- a/secert-hitler/Cargo.lock +++ b/secert-hitler/Cargo.lock @@ -1,5 +1,25 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +[[package]] +name = "aho-corasick" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8716408b8bc624ed7f65d223ddb9ac2d044c0547b6fa4b0d554f3a9540496ada" +dependencies = [ + "memchr", +] + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi", + "libc", + "winapi", +] + [[package]] name = "autocfg" version = "1.0.0" @@ -33,6 +53,19 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "env_logger" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" +dependencies = [ + "atty", + "humantime", + "log", + "regex", + "termcolor", +] + [[package]] name = "getrandom" version = "0.1.14" @@ -44,6 +77,24 @@ dependencies = [ "wasi", ] +[[package]] +name = "hermit-abi" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61565ff7aaace3525556587bd2dc31d4a07071957be715e63ce7b1eccf51a8f4" +dependencies = [ + "libc", +] + +[[package]] +name = "humantime" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" +dependencies = [ + "quick-error", +] + [[package]] name = "json" version = "0.12.4" @@ -62,18 +113,39 @@ version = "0.2.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99e85c08494b21a9054e7fe1374a732aeadaff3980b6990b94bfd3a70f690005" +[[package]] +name = "log" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7" +dependencies = [ + "cfg-if", +] + [[package]] name = "maybe-uninit" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" +[[package]] +name = "memchr" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400" + [[package]] name = "ppv-lite86" version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74490b50b9fbe561ac330df47c08f3f33073d2d00c150f719147d7c54522fa1b" +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + [[package]] name = "rand" version = "0.7.3" @@ -115,17 +187,86 @@ dependencies = [ "rand_core", ] +[[package]] +name = "regex" +version = "1.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6020f034922e3194c711b82a627453881bc4682166cabb07134a10c26ba7692" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", + "thread_local", +] + +[[package]] +name = "regex-syntax" +version = "0.6.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe5bd57d1d7414c6b5ed48563a2c855d995ff777729dcd91c369ec7fea395ae" + [[package]] name = "secert-hitler" version = "0.1.0" dependencies = [ "crossbeam-channel", + "env_logger", "json", + "log", "rand", ] +[[package]] +name = "termcolor" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb6bfa289a4d7c5766392812c0a1f4c1ba45afa1ad47803c11e1f407d846d75f" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "thread_local" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14" +dependencies = [ + "lazy_static", +] + [[package]] name = "wasi" version = "0.9.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "winapi" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/secert-hitler/Cargo.toml b/secert-hitler/Cargo.toml index c115ed5..21c5852 100644 --- a/secert-hitler/Cargo.toml +++ b/secert-hitler/Cargo.toml @@ -10,3 +10,5 @@ edition = "2018" rand = "*" crossbeam-channel = "*" json = "*" +env_logger = "*" +log = "*" diff --git a/secert-hitler/src/controller/gamemaster/gameevent.rs b/secert-hitler/src/controller/gamemaster/gameevent.rs index d51c43b..54bdc90 100644 --- a/secert-hitler/src/controller/gamemaster/gameevent.rs +++ b/secert-hitler/src/controller/gamemaster/gameevent.rs @@ -44,6 +44,23 @@ impl GameEventType { _ => return GameEventType::Null, } } + + fn build(&self) -> GameEvent { + let mut d = json::object!{ + GameEventType: format!("{:?}", self), + sources: [], + targets: [], + params: [], + }; + match self { + _ => {}, + }; + let s = d.dump(); + let d = json::object!{ + "body": s, + }; + GameEvent::new(d.dump()) + } } impl GameEvent { @@ -136,6 +153,30 @@ mod tests { assert!(GameEventType::from_string("GameStop".to_string()) == GameEventType::GameStop); } + #[test] + fn type_build() { + let cases = vec![ + GameEventType::Null, + GameEventType::GameStart, + GameEventType::RoleSet, + GameEventType::ElectionPend, + GameEventType::ElectionSet, + GameEventType::VoteSet, + GameEventType::CardPend, + GameEventType::CardPick, + GameEventType::PolicySet, + GameEventType::SpecialInspect, + GameEventType::SpecialSelect, + GameEventType::SpecialKill, + GameEventType::SpecialPeek, + GameEventType::GameStop, + ]; + for c in &cases { + let gameevent = c.build(); + assert!(*c == gameevent.mode(), "{:?}.build() yielded {:?}", c, gameevent); + } + } + #[test] fn sources() { let ge = GameEvent::new(r#"{"body": "{\"sources\": [\"a\", \"b\"]}"}"#.to_string()); diff --git a/secert-hitler/src/controller/gamemaster/gamemaster.rs b/secert-hitler/src/controller/gamemaster/gamemaster.rs index 2a1b5b0..178e329 100644 --- a/secert-hitler/src/controller/gamemaster/gamemaster.rs +++ b/secert-hitler/src/controller/gamemaster/gamemaster.rs @@ -2,8 +2,10 @@ use super::super::super::model::state::room::Room; use super::lobby::Lobby; use super::gameevent::GameEvent; use super::gameevent::GameEventType; + use std::thread; use std::time; +use log::{info, warn, error, debug}; pub struct GameMaster { room: Box, @@ -11,15 +13,21 @@ pub struct GameMaster { } impl GameMaster { - fn new(room: Box) -> GameMaster { + pub fn new(room: Box) -> GameMaster { + info!("created for room {}", room.room_id()); GameMaster{ room: room, lobby: Lobby::new(), } } - fn run(&mut self) -> Result { - self.run_lobby()?; + pub fn run(&mut self) -> Result { + loop { + let r = self.run_lobby(); + if r.is_ok() { + break + } + } self.run_game_setup()?; self.run_game() } @@ -28,10 +36,8 @@ impl GameMaster { while !self.lobby.locked { let rollback = self.room.since(); let events = self.room.sync(); - println!("top of loop: since={:?}, events={:?}", self.room.since(), events); for e in &events { let ge = GameEvent::new(e.body.clone()); - println!(" ge.mode = {:?}", ge.mode()); if ge.mode() == GameEventType::GameStart { self.room.rollback(e.since.clone()); self.lobby.lock(); @@ -60,6 +66,13 @@ mod tests { use super::super::super::super::model::state::mockrooms::MockRooms; use super::super::super::super::model::state::rooms::Rooms; + fn init() { + use env_logger::Env; + let _ = env_logger::builder() + .is_test(true) + .try_init(); + } + #[test] fn new_mockroom() { let _ = GameMaster::new(Box::new(MockRoom::create())); @@ -85,6 +98,7 @@ mod tests { #[test] fn run_lobby() { + init(); let mut mrs = MockRooms::new(); let r1 = mrs.create(); let room_id = r1.room_id(); diff --git a/secert-hitler/src/main.rs b/secert-hitler/src/main.rs index e7ce932..f40b451 100644 --- a/secert-hitler/src/main.rs +++ b/secert-hitler/src/main.rs @@ -3,6 +3,20 @@ mod controller; mod model; mod view; +use self::model::state::rooms::Rooms; + +#[macro_use] extern crate log; +use env_logger::Env; + fn main() { - println!("{}", config::PORT); + env_logger::init(); + println!("{}", config::PORT); + let mut rooms = get_rooms(); + let room = rooms.create(); + let mut gamemaster = controller::gamemaster::gamemaster::GameMaster::new(room); + let _ = gamemaster; +} + +fn get_rooms() -> impl Rooms { + model::state::mockrooms::MockRooms::new() }