Skip to main content

librotenado/
names.rs

1// SPDX-License-Identifier: MIT
2//! Names by language (spec part 0003): translation data that names accounts and the stages of currencies.
3
4use std::collections::BTreeMap;
5
6use serde::{Deserialize, Serialize};
7
8use crate::Object;
9
10/// Names in one language, by key: an account's identity, or `<currency code>/<stage>` (`EUR/1`).
11#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
12pub struct Names {
13    /// The language, as a BCP 47 tag (`en`, `fr`, `de`).
14    pub language: String,
15    /// Key → name.
16    pub names: BTreeMap<String, String>,
17}
18
19impl Object for Names {
20    const TYPE: &'static str = "names";
21}
22
23impl Names {
24    /// The names of version 0.1 in `language`, if published (`spec/data/names/`): `en` and `fr`.
25    pub fn v0_1(language: &str) -> Option<Self> {
26        let json: &[u8] = match language {
27            "en" => include_bytes!("../../../spec/data/names/en.json"),
28            "fr" => include_bytes!("../../../spec/data/names/fr.json"),
29            _ => return None,
30        };
31        Some(crate::from_root(json).expect("the published names are valid"))
32    }
33
34    /// The name for this key.
35    pub fn get(&self, key: &str) -> Option<&str> {
36        self.names.get(key).map(String::as_str)
37    }
38}
39
40#[cfg(test)]
41mod tests {
42    use super::*;
43    use crate::{Chart, ChartTranslation};
44
45    #[test]
46    fn every_account_of_the_chart_has_a_name_in_english_and_french() {
47        let chart = Chart::v0_1();
48        for language in ["en", "fr"] {
49            let names = Names::v0_1(language).unwrap();
50            assert_eq!(names.language, language);
51            assert!(chart.accounts.iter().all(|a| names.get(a.id.as_str()).is_some_and(|n| !n.is_empty())));
52            assert_eq!(names.names.len(), chart.accounts.len());
53        }
54        let pcg = ChartTranslation::fr_pcg();
55        let fr = Names::v0_1("fr").unwrap();
56        assert_eq!(fr.get(pcg.accounts["512"].as_str()), Some("Banques"));
57        assert_eq!(Names::v0_1("en").unwrap().get(pcg.accounts["512"].as_str()), Some("Banks"));
58        assert!(Names::v0_1("de").is_none());
59    }
60}