use serde::{Deserialize, Serialize};
use super::extensions::Extensions;
use super::string::OcpiString;
use super::text::InvalidString;
use super::validate::{Validate, Validator};
use super::validate_fields;
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[non_exhaustive]
pub struct DisplayText {
pub language: OcpiString<2>,
pub text: OcpiString<512>,
#[serde(flatten, default, skip_serializing_if = "Extensions::is_empty")]
pub extensions: Extensions,
}
impl DisplayText {
pub fn new(language: impl Into<String>, text: impl Into<String>) -> Result<Self, InvalidString> {
Ok(Self {
language: OcpiString::new(language)?,
text: OcpiString::new(text)?,
extensions: Extensions::new(),
})
}
}
impl Validate for DisplayText {
fn validate_in(&self, v: &mut Validator) {
validate_fields!(self, v, language, text);
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn round_trips_and_keeps_extensions() {
let json = r#"{"language":"en","text":"2 euro per hour","nltnm_source":"cms"}"#;
let dt: DisplayText = serde_json::from_str(json).unwrap();
assert_eq!(dt.text.as_str(), "2 euro per hour");
assert_eq!(serde_json::to_string(&dt).unwrap(), json);
}
#[test]
fn constructor_enforces_the_language_code_length() {
assert!(DisplayText::new("en", "hello").is_ok());
assert!(DisplayText::new("english", "hello").is_err());
}
}