ocpi 0.3.5

Unofficial, in progress, OCPI implementation
Documentation
use super::{CsString, Language, StringError};

#[derive(Clone, Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub struct DisplayText {
    /// Language Code ISO 639-1.
    pub language: Language,

    /// Text to be displayed to a end user. No markup, html etc. allowed.
    pub text: CsString<512>,
}

pub trait AsDisplayText
where
    Self: Sized,
{
    fn in_language(self, language: Language) -> Result<DisplayText, StringError>;
    fn must_in_language(self, language: Language) -> DisplayText {
        self.in_language(language).expect("Invalid text")
    }

    fn must_en(self) -> DisplayText {
        self.must_in_language(Language::En)
    }
}

impl<T> AsDisplayText for T
where
    T: Into<String>,
{
    fn in_language(self, language: Language) -> Result<DisplayText, StringError> {
        Ok(DisplayText {
            language,
            text: self.into().try_into()?,
        })
    }
}

#[cfg(test)]
mod tests {

    use super::*;

    #[test]
    fn deserialize_example() {
        let res = serde_json::from_str::<DisplayText>(
            r#"
{
"language": "en",
"text": "Standard Tariff"
}
"#,
        )
        .expect("Deser example");

        assert_eq!(res.language, Language::En);
        assert_eq!(res.text, "Standard Tariff");
    }
}