impl gameevent serialize

master^2
bel 2020-05-06 09:01:25 -06:00
parent 44c4089e26
commit 829a10f75b
2 changed files with 62 additions and 3 deletions

View File

@ -3,8 +3,8 @@ use json;
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
pub struct GameEvent { pub struct GameEvent {
d: json::JsonValue, pub d: json::JsonValue,
sender: String, pub sender: String,
} }
#[derive(PartialEq, Eq, Debug, Clone)] #[derive(PartialEq, Eq, Debug, Clone)]
@ -122,12 +122,30 @@ impl GameEvent {
} }
out out
} }
pub fn serialize(&self) -> String {
(json::object!{
GameEventType: format!("{:?}", self.mode()),
sources: self.sources(),
targets: self.targets(),
params: self.params(),
}).dump()
}
} }
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::*; use super::*;
use log::{debug, LevelFilter};
fn init() {
let _ = env_logger::builder()
.is_test(true)
.filter_level(LevelFilter::Trace)
.try_init();
}
#[test] #[test]
fn new() { fn new() {
let ge = GameEvent::new(Event{sender: "".to_string(), body: "\"a\"".to_string(), since: "".to_string()}); 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.targets().len() == 0);
assert!(ge.sources().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());
}
} }

View File

@ -5,6 +5,8 @@ use super::super::policy::Policy;
use super::super::role::Role; use super::super::role::Role;
use super::super::player::Player; use super::super::player::Player;
use json;
impl GameMaster { impl GameMaster {
pub fn game_is_over(&mut self) -> Result<GameEvent, Role> { pub fn game_is_over(&mut self) -> Result<GameEvent, Role> {
if self.policies[&Policy::Facist] >= 3 { if self.policies[&Policy::Facist] >= 3 {
@ -28,7 +30,11 @@ impl GameMaster {
pub fn game_election(&mut self) -> Result<GameEvent, Role> { pub fn game_election(&mut self) -> Result<GameEvent, Role> {
let mut ge = GameEventType::ElectionPend.build(); let mut ge = GameEventType::ElectionPend.build();
let president_candidate = self.candidate_presidents.pop().unwrap(); 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) Err(Role::Null)
} }