Skip to main content

activitystreams_vocabulary/langtag/
map.rs

1use std::collections::BTreeMap;
2
3use serde::{Deserialize, Serialize};
4
5use crate::{LanguageTag, field_access, impl_default, impl_display};
6
7/// Multiple language-tagged values.
8#[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    /// Creates a new [LanguageMap].
16    pub fn new() -> Self {
17        Self {
18            map: BTreeMap::new(),
19        }
20    }
21
22    /// Gets a mutable reference to the map.
23    pub fn map_mut(&mut self) -> &mut BTreeMap<LanguageTag, String> {
24        &mut self.map
25    }
26}
27
28field_access! {
29    LanguageMap {
30        /// Inner mapping of [LanguageTag] to content string in that language.
31        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}