tnnl 0.1.17

tnnl gives you full control over whether and when your IoT devices should be reachable from the internet
use serde::{Deserialize, Serialize};
use serde_json::Value;

use crate::apperror::AppError;

#[derive(Serialize, Deserialize, Debug, PartialEq)]
pub struct SiteInfo {
    #[serde(rename = "name")]
    pub name: String,
    #[serde(rename = "domain")]
    pub domain: String,
    #[serde(rename = "description")]
    pub description: Option<String>,
    #[serde(rename = "enabled")]
    pub enabled: bool,
    // http: {enabled: bool}
    // socks: {enabled: bool}
}

impl SiteInfo {
    pub(crate) fn from_value(value: Value) -> Result<SiteInfo, AppError> {
        serde_json::from_value(value).map_err(|_| AppError::new("parsing site info failed"))
    }
}

#[cfg(test)]
mod site_info_tests {
    use super::*;

    #[test]
    fn deserialize() {
        let value = serde_json::from_str("{\"description\":null,\"domain\":\"tnnl.de\",\"enabled\":true,\"http\":{\"enabled\":true},\"name\":\"esp-demo\",\"socks\":{\"enabled\":true}}").unwrap();
        let result = SiteInfo::from_value(value).unwrap();

        assert_eq!(result.name, "esp-demo");
        assert_eq!(result.domain, "tnnl.de");
        assert_eq!(result.description, Option::None);
        assert!(result.enabled);
    }
}