activitystreams_vocabulary/langtag/
map.rs1use std::collections::BTreeMap;
2
3use serde::{Deserialize, Serialize};
4
5use crate::{LanguageTag, field_access, impl_default, impl_display};
6
7#[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Deserialize, Serialize)]
9pub struct LanguageMap {
10 #[serde(flatten)]
11 map: BTreeMap<LanguageTag, String>,
12}
13
14impl LanguageMap {
15 pub fn new() -> Self {
17 Self {
18 map: BTreeMap::new(),
19 }
20 }
21
22 pub fn map_mut(&mut self) -> &mut BTreeMap<LanguageTag, String> {
24 &mut self.map
25 }
26}
27
28field_access! {
29 LanguageMap {
30 map: as_ref { BTreeMap<LanguageTag, String> },
32 }
33}
34
35impl_default!(LanguageMap);
36impl_display!(LanguageMap, json);
37
38#[cfg(test)]
39mod tests {
40 use super::*;
41
42 #[test]
43 fn test_language_map() {
44 let en_tag = LanguageTag::try_from("en").unwrap();
45 let es_tag = LanguageTag::try_from("es").unwrap();
46 let zh_tag = LanguageTag::try_from("zh-Hans").unwrap();
47
48 let summary_en = "A simple <em>note</em>";
49 let summary_es = "Una <em>nota</em> sencilla";
50 let summary_zh = "一段<em>简单的</em>笔记";
51
52 let summary_str = format!(
53 r#"{{"{en_tag}":"{summary_en}","{es_tag}":"{summary_es}","{zh_tag}":"{summary_zh}"}}"#
54 );
55
56 let summary = LanguageMap::new().with_map([
57 (en_tag, summary_en.to_owned()),
58 (es_tag, summary_es.to_owned()),
59 (zh_tag, summary_zh.to_owned()),
60 ]);
61
62 assert_eq!(serde_json::to_string(&summary).unwrap(), summary_str);
63 assert_eq!(
64 serde_json::from_str::<LanguageMap>(&summary_str).unwrap(),
65 summary
66 );
67 }
68}