dialtone_common 0.1.0

Dialtone Common Code
Documentation
use serde::{Deserialize, Serialize};
use serde_variant::to_variant_name;
use std::str::FromStr;

#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)]
pub enum Theme {
    #[serde(rename = "green on black")]
    GreenOnBlack,

    #[serde(rename = "green on black with amber")]
    GreenOnBlackWithAmber,

    #[serde(rename = "black on light gray")]
    BlackOnLightGray,

    #[serde(rename = "black on white")]
    BlackOnWhite,

    #[serde(rename = "black on white with red")]
    BlackOnWhiteWithRed,

    #[serde(rename = "black on white with green")]
    BlackOnWhiteWithGreen,

    #[serde(rename = "white on blue")]
    WhiteOnBlue,

    #[serde(rename = "white on blue with green")]
    WhiteOnBlueWithGreen,

    #[serde(rename = "amber on black")]
    AmberOnBlack,

    #[serde(rename = "amber on black with blue")]
    AmberOnBlackWithBlue,

    #[serde(rename = "blue on white")]
    BlueOnWhite,

    #[serde(rename = "blue on black")]
    BlueOnBlack,

    #[serde(rename = "tandy 400")]
    Tandy400,

    #[serde(rename = "botho")]
    Botho,
}

impl FromStr for Theme {
    type Err = &'static str;

    fn from_str(s: &str) -> Result<Self, Self::Err> {
        let s = s.to_lowercase().replace(&['-', '_'][..], " ");
        match s {
            a if a == Theme::GreenOnBlack.to_string() => Ok(Theme::GreenOnBlack),
            a if a == Theme::AmberOnBlack.to_string() => Ok(Theme::AmberOnBlack),
            _ => Err("no matching theme"),
        }
    }
}

impl ToString for Theme {
    fn to_string(&self) -> String {
        to_variant_name(&self).unwrap().to_string()
    }
}

#[cfg(test)]
mod theme_tests {
    use crate::rest::sites::theme::Theme;
    use std::str::FromStr;

    #[test]
    fn test_from_str() {
        assert_eq!(
            Ok(Theme::GreenOnBlack),
            Theme::from_str(Theme::GreenOnBlack.to_string().as_str())
        );
        assert_eq!(Ok(Theme::GreenOnBlack), Theme::from_str("green-on-black"));
        assert_eq!(Ok(Theme::GreenOnBlack), Theme::from_str("green_on_black"));

        assert_eq!(
            Ok(Theme::AmberOnBlack),
            Theme::from_str(Theme::AmberOnBlack.to_string().as_str())
        );
        assert_eq!(Ok(Theme::AmberOnBlack), Theme::from_str("amber-on-black"));
        assert_eq!(Ok(Theme::AmberOnBlack), Theme::from_str("amber_on_black"));
    }

    #[test]
    fn test_to_string() {
        assert_eq!("amber on black", Theme::AmberOnBlack.to_string());
        assert_eq!("green on black", Theme::GreenOnBlack.to_string());
    }
}