use alloc::{string::String, string::ToString, vec::Vec};
use core::ops::Deref;
use musicxml_internal::{DatatypeDeserializer, DatatypeSerializer};
#[derive(Debug, PartialEq, Eq)]
pub struct FontFamily(pub Vec<String>);
impl Deref for FontFamily {
type Target = Vec<String>;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl DatatypeSerializer for FontFamily {
fn serialize(element: &Self) -> String {
element.0.join(",")
}
}
impl DatatypeDeserializer for FontFamily {
fn deserialize(value: &str) -> Result<Self, String> {
let mut res: Vec<String> = Vec::new();
value.split(',').for_each(|item| {
let val = item.trim();
if !val.is_empty() {
res.push(val.to_string());
}
});
Ok(FontFamily(res))
}
}
#[cfg(test)]
mod font_family_tests {
use super::*;
#[test]
fn serialize_valid1() {
let test = FontFamily(vec![
String::from("Ariel"),
String::from("Times New Roman"),
String::from("Courier"),
]);
let result = FontFamily::serialize(&test);
assert_eq!(result, "Ariel,Times New Roman,Courier");
}
#[test]
fn serialize_valid2() {
let test = FontFamily(vec![String::from("Ariel")]);
let result = FontFamily::serialize(&test);
assert_eq!(result, "Ariel");
}
#[test]
fn deserialize_valid1() {
let result = FontFamily::deserialize("Ariel");
assert!(result.is_ok());
assert_eq!(result.unwrap(), FontFamily(vec![String::from("Ariel")]));
}
#[test]
fn deserialize_valid2() {
let result = FontFamily::deserialize("Ariel,Times New Roman");
assert!(result.is_ok());
assert_eq!(
result.unwrap(),
FontFamily(vec![String::from("Ariel"), String::from("Times New Roman")])
);
}
#[test]
fn deserialize_valid3() {
let result = FontFamily::deserialize("Ariel, Courier,Helvetica");
assert!(result.is_ok());
assert_eq!(
result.unwrap(),
FontFamily(vec![
String::from("Ariel"),
String::from("Courier"),
String::from("Helvetica")
])
);
}
#[test]
fn deserialize_valid4() {
let result = FontFamily::deserialize(",Ariel, Courier,Helvetica");
assert!(result.is_ok());
assert_eq!(
result.unwrap(),
FontFamily(vec![
String::from("Ariel"),
String::from("Courier"),
String::from("Helvetica")
])
);
}
#[test]
fn deserialize_valid5() {
let result = FontFamily::deserialize(",Ariel");
assert!(result.is_ok());
assert_eq!(result.unwrap(), FontFamily(vec![String::from("Ariel")]));
}
}