secret-hitler/secert-hitler/src/model/state/event.rs

141 lines
2.8 KiB
Rust

use json;
#[derive(Clone, Debug)]
pub struct Event {
pub sender: String,
pub body: String,
pub next: String,
}
#[derive(PartialEq, Eq, Debug)]
pub enum EventType {
Null,
Join,
Create,
Message,
}
impl Event {
pub fn mode(&self) -> EventType {
let d = json::parse(&self.body).unwrap();
if d["membership"].is_string() {
return match d["membership"].as_str().unwrap().to_string().as_ref() {
"join" => EventType::Join,
_ => EventType::Null,
};
}
if d["creator"].is_string() {
return EventType::Create;
}
if d["msgtype"].is_string() {
return match d["msgtype"].as_str().unwrap().to_string().as_ref() {
"m.text" => EventType::Message,
_ => EventType::Null,
};
}
EventType::Null
}
pub fn join(&self) -> Option<String> {
let d = json::parse(&self.body).unwrap();
match self.mode() {
EventType::Join => true,
_ => return None,
};
let o = d["displayname"].as_str();
if o.is_none() {
return None;
}
Some(o.unwrap().to_string())
}
}
#[cfg(test)]
mod tests {
use super::*;
fn _dummy() -> Event {
Event{
sender: "sender".to_string(),
body: r#"{}"#.to_string(),
next: "next".to_string(),
}
}
#[test]
fn event() {
let e = Event{
sender: "sender".to_string(),
body: "body".to_string(),
next: "next".to_string(),
};
println!("{:?}", e);
}
#[test]
fn mode_null() {
let mut e = _dummy();
e.body = r#"{
}"#.to_string();
assert!(e.mode() == EventType::Null);
}
#[test]
fn mode_create() {
let mut e = _dummy();
e.body = r#"{
"creator": "abc"
}"#.to_string();
assert!(e.mode() == EventType::Create);
}
#[test]
fn mode_msgtype() {
let mut e = _dummy();
e.body = r#"{
"msgtype": "m.text"
}"#.to_string();
assert!(e.mode() == EventType::Message);
}
#[test]
fn mode_join() {
let mut e = _dummy();
e.body = r#"{
"membership": "join"
}"#.to_string();
assert!(e.mode() == EventType::Join);
}
#[test]
fn join_some() {
let mut e = _dummy();
e.body = r#"{
"displayname": "hi",
"membership": "join"
}"#.to_string();
let j = e.join();
assert!(j.is_some());
}
#[test]
fn join_some_bad() {
let mut e = _dummy();
e.body = r#"{
"membership": "join"
}"#.to_string();
let j = e.join();
assert!(j.is_none());
}
#[test]
fn join_none() {
let mut e = _dummy();
e.body = r#"{
"a": "b"
}"#.to_string();
let j = e.join();
assert!(j.is_none());
}
}