From 829a10f75bd5005ca91d40feb2e5483047df7fdd Mon Sep 17 00:00:00 2001 From: bel Date: Wed, 6 May 2020 09:01:25 -0600 Subject: [PATCH] impl gameevent serialize --- .../src/controller/gamemaster/gameevent.rs | 57 ++++++++++++++++++- .../controller/gamemaster/gamemaster/game.rs | 8 ++- 2 files changed, 62 insertions(+), 3 deletions(-) diff --git a/secert-hitler/src/controller/gamemaster/gameevent.rs b/secert-hitler/src/controller/gamemaster/gameevent.rs index a703ee4..2e95830 100644 --- a/secert-hitler/src/controller/gamemaster/gameevent.rs +++ b/secert-hitler/src/controller/gamemaster/gameevent.rs @@ -3,8 +3,8 @@ use json; #[derive(Clone, Debug)] pub struct GameEvent { - d: json::JsonValue, - sender: String, + pub d: json::JsonValue, + pub sender: String, } #[derive(PartialEq, Eq, Debug, Clone)] @@ -122,12 +122,30 @@ impl GameEvent { } out } + + pub fn serialize(&self) -> String { + (json::object!{ + GameEventType: format!("{:?}", self.mode()), + sources: self.sources(), + targets: self.targets(), + params: self.params(), + }).dump() + } } #[cfg(test)] mod tests { use super::*; + use log::{debug, LevelFilter}; + + fn init() { + let _ = env_logger::builder() + .is_test(true) + .filter_level(LevelFilter::Trace) + .try_init(); + } + #[test] fn new() { let ge = GameEvent::new(Event{sender: "".to_string(), body: "\"a\"".to_string(), since: "".to_string()}); @@ -220,4 +238,39 @@ mod tests { assert!(ge.targets().len() == 0); assert!(ge.sources().len() == 0); } + + #[test] + fn serialize() { + init(); + let ge = GameEvent{ + d: json::object!{}, + sender: "a".to_string(), + }; + assert!(ge.serialize() == r#"{"GameEventType":"Null","sources":[],"targets":[],"params":[]}"#, "{}", ge.serialize()); + + let ge = GameEvent{ + d: json::object!{GameEventType: "GameStart"}, + sender: "a".to_string(), + }; + assert!(ge.serialize() == r#"{"GameEventType":"GameStart","sources":[],"targets":[],"params":[]}"#, "{}", ge.serialize()); + + let ge = GameEvent{ + d: json::object!{GameEventType: "GameStart", params: ["hi"]}, + sender: "a".to_string(), + }; + assert!(ge.serialize() == r#"{"GameEventType":"GameStart","sources":[],"targets":[],"params":["hi"]}"#, "{}", ge.serialize()); + + let ge = GameEvent{ + d: json::object!{GameEventType: "GameStart", sources: ["hi"], targets: ["hi2"]}, + sender: "a".to_string(), + }; + assert!(ge.serialize() == r#"{"GameEventType":"GameStart","sources":["hi"],"targets":["hi2"],"params":[]}"#, "{}", ge.serialize()); + + let ge = GameEvent{ + d: json::object!{GameEventType: "Null", sources: ["hi"], targets: ["hi2"]}, + sender: "a".to_string(), + }; + assert!(ge.serialize() == r#"{"GameEventType":"Null","sources":["hi"],"targets":["hi2"],"params":[]}"#, "{}", ge.serialize()); + debug!("sample gameevent serialize: {}", ge.serialize()); + } } diff --git a/secert-hitler/src/controller/gamemaster/gamemaster/game.rs b/secert-hitler/src/controller/gamemaster/gamemaster/game.rs index e2cab80..434b2b5 100644 --- a/secert-hitler/src/controller/gamemaster/gamemaster/game.rs +++ b/secert-hitler/src/controller/gamemaster/gamemaster/game.rs @@ -5,6 +5,8 @@ use super::super::policy::Policy; use super::super::role::Role; use super::super::player::Player; +use json; + impl GameMaster { pub fn game_is_over(&mut self) -> Result { if self.policies[&Policy::Facist] >= 3 { @@ -28,7 +30,11 @@ impl GameMaster { pub fn game_election(&mut self) -> Result { let mut ge = GameEventType::ElectionPend.build(); let president_candidate = self.candidate_presidents.pop().unwrap(); - ge.d["targets"] = [president_candidate.clone()]; + ge.d["targets"] = json::array![president_candidate.clone()]; + ge.d["params"] = json::array!["president"]; + if self.room.send(ge.serialize()).is_err() { + return Err(Role::Null); + } Err(Role::Null) }