1use std::collections::BTreeMap;
5
6use serde::{Deserialize, Serialize};
7
8use crate::Object;
9
10#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
12pub struct Names {
13 pub language: String,
15 pub names: BTreeMap<String, String>,
17}
18
19impl Object for Names {
20 const TYPE: &'static str = "names";
21}
22
23impl Names {
24 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 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}