use super::{CsString, Language, StringError};
#[derive(Clone, Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub struct DisplayText {
pub language: Language,
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");
}
}