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");
}
}