use serde::Deserialize;
use crate::error::ParseError;
use crate::types::{Scheme, WakeupDuration};
#[derive(Debug, Clone, Deserialize)]
pub struct SchemeResponse {
#[serde(rename = "Scheme")]
scheme: u8,
}
impl SchemeResponse {
pub fn scheme(&self) -> Result<Scheme, ParseError> {
Scheme::new(self.scheme).map_err(|_| ParseError::InvalidValue {
field: "Scheme".to_string(),
message: format!("invalid scheme value: {}", self.scheme),
})
}
#[must_use]
pub const fn scheme_raw(&self) -> u8 {
self.scheme
}
}
#[derive(Debug, Clone, Deserialize)]
pub struct WakeupDurationResponse {
#[serde(rename = "WakeUpDuration")]
wakeup_duration: u16,
}
impl WakeupDurationResponse {
pub fn duration(&self) -> Result<WakeupDuration, ParseError> {
WakeupDuration::from_raw(self.wakeup_duration).map_err(|_| ParseError::InvalidValue {
field: "WakeupDuration".to_string(),
message: format!("invalid wakeup duration: {}", self.wakeup_duration),
})
}
#[must_use]
pub const fn seconds(&self) -> u16 {
self.wakeup_duration
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn parse_scheme_response() {
let json = r#"{"Scheme": 1}"#;
let response: SchemeResponse = serde_json::from_str(json).unwrap();
assert_eq!(response.scheme().unwrap(), Scheme::WAKEUP);
assert_eq!(response.scheme_raw(), 1);
}
#[test]
fn parse_scheme_response_all_values() {
for value in 0..=4 {
let json = format!(r#"{{"Scheme": {value}}}"#);
let response: SchemeResponse = serde_json::from_str(&json).unwrap();
assert_eq!(response.scheme_raw(), value);
assert!(response.scheme().is_ok());
}
}
#[test]
fn parse_scheme_response_invalid() {
let json = r#"{"Scheme": 5}"#;
let response: SchemeResponse = serde_json::from_str(json).unwrap();
assert!(response.scheme().is_err());
}
#[test]
fn parse_wakeup_duration_response() {
let json = r#"{"WakeUpDuration": 300}"#;
let response: WakeupDurationResponse = serde_json::from_str(json).unwrap();
assert_eq!(response.duration().unwrap().seconds(), 300);
assert_eq!(response.seconds(), 300);
}
#[test]
fn parse_wakeup_duration_response_edge_cases() {
let json = r#"{"WakeUpDuration": 1}"#;
let response: WakeupDurationResponse = serde_json::from_str(json).unwrap();
assert_eq!(response.duration().unwrap().seconds(), 1);
let json = r#"{"WakeUpDuration": 3000}"#;
let response: WakeupDurationResponse = serde_json::from_str(json).unwrap();
assert_eq!(response.duration().unwrap().seconds(), 3000);
}
#[test]
fn parse_wakeup_duration_response_invalid() {
let json = r#"{"WakeUpDuration": 0}"#;
let response: WakeupDurationResponse = serde_json::from_str(json).unwrap();
assert!(response.duration().is_err());
let json = r#"{"WakeUpDuration": 3001}"#;
let response: WakeupDurationResponse = serde_json::from_str(json).unwrap();
assert!(response.duration().is_err());
}
}