use response::Timestamp;
use rustc_serialize::json::Json;
#[derive(Clone)]
pub struct BurglarAlarmData {
json: Json,
}
#[derive(Clone)]
pub struct GeneralPurposeBinaryData {
json: Json,
}
impl BurglarAlarmData {
pub fn new(json: &Json) -> BurglarAlarmData {
BurglarAlarmData { json: json.clone() }
}
pub fn get_activated(&self) -> Option<bool> {
let mask = match self.get_event_mask() {
None => { return None; },
Some(s) => s,
};
match mask {
128i64 => self.get_status(), 264i64 => self.get_event() .and_then(|ev| Some(ev != 0 && ev != 254)), _ => None,
}
}
pub fn get_status(&self) -> Option<bool> {
self.json.find_path(&["status", "value"])
.and_then(|j| j.as_i64())
.and_then(|n| Some(n != 0))
}
pub fn get_status_updated(&self) -> Option<Timestamp> {
self.json.find_path(&["status", "updateTime"])
.and_then(|j| j.as_i64())
}
pub fn get_event(&self) -> Option<i64> {
self.json.find_path(&["event", "value"])
.and_then(|j| j.as_i64())
}
pub fn get_event_updated(&self) -> Option<Timestamp> {
self.json.find_path(&["event", "updateTime"])
.and_then(|j| j.as_i64())
}
pub fn get_event_mask(&self) -> Option<i64> {
self.json.find_path(&["eventMask", "value"])
.and_then(|j| j.as_i64())
}
pub fn get_event_string(&self) -> Option<String> {
self.json.find_path(&["eventString", "value"])
.and_then(|j| j.as_string())
.and_then(|s| Some(s.to_string()))
}
pub fn get_json(&self) -> &Json {
&self.json
}
}
impl GeneralPurposeBinaryData {
pub fn new(json: &Json) -> GeneralPurposeBinaryData {
GeneralPurposeBinaryData { json: json.clone() }
}
pub fn get_status(&self) -> Option<bool> {
self.json.find_path(&["level", "value"])
.and_then(|j| j.as_boolean())
}
pub fn get_status_updated(&self) -> Option<Timestamp> {
self.json.find_path(&["level", "updateTime"])
.and_then(|j| j.as_i64())
}
pub fn get_json(&self) -> &Json {
&self.json
}
}
#[cfg(test)]
mod tests {
mod burglar_alarm {
use response::*;
use sensors::*;
use rustc_serialize::json::Json;
#[test]
fn get_activated() {
let mut json = "{}";
assert_eq!(burglar_alarm(json).get_activated(), None);
assert_eq!(burglar_alarm("{\"foo\": 0}").get_activated(), None);
assert_eq!(burglar_alarm("{\"eventMask\": 0}").get_activated(), None);
json = "{\"eventMask\": {\"value\": 128}, \"status\": {\"value\": 0}}";
assert_eq!(burglar_alarm(json).get_activated(), Some(false));
json = "{\"eventMask\": {\"value\": 128}, \"status\": {\"value\": 255}}";
assert_eq!(burglar_alarm(json).get_activated(), Some(true));
json = "{\"eventMask\": {\"value\": 264}, \"event\": {\"value\": 0}}";
assert_eq!(burglar_alarm(json).get_activated(), Some(false));
json = "{\"eventMask\": {\"value\": 264}, \"event\": {\"value\": 254}}";
assert_eq!(burglar_alarm(json).get_activated(), Some(false));
json = "{\"eventMask\": {\"value\": 264}, \"event\": {\"value\": 8}}";
assert_eq!(burglar_alarm(json).get_activated(), Some(true));
}
#[test]
fn get_status_true() {
let json = Json::from_str("{\"status\": {\"value\": 255}}").unwrap();
let alarm = BurglarAlarmData { json: json.clone() };
assert!(alarm.get_status().unwrap());
}
#[test]
fn get_status_false() {
let json = Json::from_str("{\"status\": {\"value\": 0}}").unwrap();
let alarm = BurglarAlarmData { json: json.clone() };
assert!(!alarm.get_status().unwrap());
}
#[test]
fn get_status_invalid() {
let json = Json::from_str("{\"status\": {\"value\": true}}").unwrap();
let alarm = BurglarAlarmData { json: json.clone() };
assert!(alarm.get_status().is_none());
}
#[test]
fn get_status_not_present() {
let json = Json::from_str("{}").unwrap();
let alarm = BurglarAlarmData { json: json.clone() };
assert!(alarm.get_status().is_none());
}
#[test]
fn get_status_absent() {
let response = DataResponse::from_str("{}").unwrap();
let result = response.get_burglar_alarm(4, 1);
assert!(result.is_none());
}
#[test]
fn get_event() {
assert_eq!(burglar_alarm("{}").get_event(), None);
assert_eq!(burglar_alarm("{\"event\": {\"foo\": 0}}").get_event(), None);
assert_eq!(burglar_alarm("{\"event\": {\"value\": true}}").get_event(), None);
assert_eq!(burglar_alarm("{\"event\": {\"value\": 0}}").get_event(),
Some(0i64));
assert_eq!(burglar_alarm("{\"event\": {\"value\": 255}}").get_event(),
Some(255i64));
}
#[test]
fn get_event_updated() {
assert_eq!(burglar_alarm("{}").get_event_updated(), None);
assert_eq!(burglar_alarm("{\"event\": {\"foo\": 0}}").get_event_updated(),
None);
assert_eq!(burglar_alarm("{\"event\": {\"value\": true}}").get_event_updated(),
None);
assert_eq!(burglar_alarm("{\"event\": {\"updateTime\": 0}}")
.get_event_updated(), Some(0i64));
assert_eq!(burglar_alarm("{\"event\": {\"updateTime\": 1457816333}}")
.get_event_updated(), Some(1457816333i64));
}
#[test]
fn get_event_mask() {
assert_eq!(burglar_alarm("{}").get_event_mask(), None);
assert_eq!(burglar_alarm("{\"eventMask\": {\"foo\": 0}}").get_event_mask(),
None);
assert_eq!(burglar_alarm("{\"eventMask\": {\"value\": true}}")
.get_event_mask(), None);
assert_eq!(burglar_alarm("{\"eventMask\": {\"value\": 0}}").get_event_mask(),
Some(0i64));
assert_eq!(burglar_alarm("{\"eventMask\": {\"value\": 255}}").get_event_mask(),
Some(255i64));
}
#[test]
fn get_event_string() {
assert_eq!(burglar_alarm("{}").get_event_string(), None);
assert_eq!(burglar_alarm("{\"eventString\": {\"foo\": 0}}").get_event_string(),
None);
assert_eq!(burglar_alarm("{\"eventString\": {\"value\": true}}")
.get_event_string(), None);
assert_eq!(burglar_alarm("{\"eventString\": {\"value\": \"\"}}")
.get_event_string(), Some("".to_string()));
assert_eq!(burglar_alarm("{\"eventString\": {\"value\": \"test\"}}")
.get_event_string(), Some("test".to_string()));
}
fn burglar_alarm(json_string: &str) -> BurglarAlarmData {
match Json::from_str(json_string) {
Err(_) => BurglarAlarmData { json: Json::from_str("{}").unwrap() },
Ok(json) => BurglarAlarmData { json: json.clone() },
}
}
}
}