use crate::{
rpc::{typed_data::Data, TypedData},
timer::ScheduleStatus,
};
use serde::Deserialize;
use serde_json::from_str;
use std::collections::HashMap;
#[derive(Debug, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct TimerInfo {
pub schedule_status: ScheduleStatus,
pub is_past_due: bool,
}
impl TimerInfo {
#[doc(hidden)]
pub fn new(data: TypedData, _: HashMap<String, TypedData>) -> Self {
match &data.data {
Some(Data::Json(s)) => from_str(s).expect("failed to parse timer JSON data"),
_ => panic!("expected JSON data for timer trigger binding"),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn it_has_json_data() {
const JSON: &'static str = r#"{"ScheduleStatus":{"Last":"0001-01-01T00:00:00","Next":"2018-07-24T23:24:00-07:00","LastUpdated":"0001-01-01T00:00:00"},"IsPastDue":true}"#;
let data = TypedData {
data: Some(Data::Json(JSON.to_string())),
};
let info = TimerInfo::new(data, HashMap::new());
assert!(info.is_past_due);
assert_eq!(
info.schedule_status.last.to_rfc3339(),
"0001-01-01T00:00:00+00:00"
);
assert_eq!(
info.schedule_status.next.to_rfc3339(),
"2018-07-25T06:24:00+00:00"
);
assert_eq!(
info.schedule_status.last_updated.to_rfc3339(),
"0001-01-01T00:00:00+00:00"
);
}
}