dialtone_common 0.1.0

Dialtone Common Code
Documentation
use crate::rest::sites::theme::Theme;
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use serde_json::Value;
use std::collections::HashMap;

#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)]
pub struct SiteInfo {
    pub host_name: String,
    pub site_data: SiteData,
    pub created_at: DateTime<Utc>,
    pub modified_at: DateTime<Utc>,
}

#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)]
pub struct SiteData {
    pub public: PublicSiteInfo,
    pub simple_code_for_registration: Option<String>,
    pub auto_approved_registrations: Vec<RegistrationMethod>,
}

impl Default for SiteData {
    fn default() -> Self {
        Self {
            public: Default::default(),
            simple_code_for_registration: None,
            auto_approved_registrations: vec![],
        }
    }
}

#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)]
pub struct PublicSiteInfo {
    pub names: SiteNames,
    pub client_defaults: ClientDefaults,
    pub registration_methods: Vec<RegistrationMethod>,
}

impl Default for PublicSiteInfo {
    fn default() -> Self {
        Self {
            names: Default::default(),
            client_defaults: Default::default(),
            registration_methods: vec![],
        }
    }
}

#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)]
pub enum RegistrationMethod {
    OpenRegistration,
    SimpleCode,
}

#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)]
pub struct SiteNames {
    pub short_name: String,
    pub long_name: String,
}

impl Default for SiteNames {
    fn default() -> Self {
        Self {
            short_name: Default::default(),
            long_name: Default::default(),
        }
    }
}

#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)]
pub struct ClientDefaults {
    pub dialtone_webclient: DialtoneWebClient,
    #[serde(flatten)]
    pub other_clients: HashMap<String, Value>,
}

impl Default for ClientDefaults {
    fn default() -> Self {
        Self {
            dialtone_webclient: Default::default(),
            other_clients: Default::default(),
        }
    }
}

#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)]
pub struct DialtoneWebClient {
    pub default_theme: Theme,
}

impl Default for DialtoneWebClient {
    fn default() -> Self {
        Self {
            default_theme: Theme::GreenOnBlack,
        }
    }
}

#[cfg(test)]
mod site_data_tests {
    use serde_json::Error;

    use super::*;

    #[test]
    #[allow(non_snake_case)]
    fn GIVEN_json_for_client_defaults_WHEN_parsed_THEN_default_theme_is_correct() {
        let input = r#"
            {
                "dialtone_webclient": 
                {
                    "default_theme": "green on black"
                }
            }
        "#;

        let json: Result<ClientDefaults, Error> = serde_json::from_str(input);

        let output = json.expect("parsing client defaults");
        assert_eq!(output.dialtone_webclient.default_theme, Theme::GreenOnBlack);
    }

    #[test]
    #[allow(non_snake_case)]
    fn GIVEN_json_for_client_defaults_with_unknown_client_WHEN_parsed_THEN_unknown_default_is_parsed(
    ) {
        let input = r#"
            {
                "dialtone_webclient": 
                {
                    "default_theme": "green on black"
                },
                "foo_client": {
                    "bar": true
                }
            }
        "#;

        let json: Result<ClientDefaults, Error> = serde_json::from_str(input);

        let output = json.expect("parsing client defaults");
        assert_eq!(output.dialtone_webclient.default_theme, Theme::GreenOnBlack);
        output
            .other_clients
            .get("foo_client")
            .expect("foo client not in hashmap");
    }
}