1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
use elsa::FrozenMap; use fluent_bundle::{FluentBundle, FluentResource}; use std::fs; use std::io; use std::iter; use unic_langid::LanguageIdentifier; fn read_file(path: &str) -> Result<String, io::Error> { fs::read_to_string(path) } pub struct ResourceManager { resources: FrozenMap<String, Box<FluentResource>>, path_scheme: String, } impl ResourceManager { pub fn new(path_scheme: String) -> Self { ResourceManager { resources: FrozenMap::new(), path_scheme, } } fn get_resource(&self, res_id: &str, locale: &str) -> &FluentResource { let path = self .path_scheme .replace("{locale}", locale) .replace("{res_id}", res_id); if let Some(res) = self.resources.get(&path) { res } else { let string = read_file(&path).unwrap(); let res = match FluentResource::try_new(string) { Ok(res) => res, Err((res, _err)) => res, }; self.resources.insert(path.to_string(), Box::new(res)) } } pub fn get_bundle( &self, locales: Vec<LanguageIdentifier>, resource_ids: Vec<String>, ) -> FluentBundle<&FluentResource> { let mut bundle = FluentBundle::new(&locales); for res_id in &resource_ids { let res = self.get_resource(res_id, &locales[0].to_string()); bundle.add_resource(res).unwrap(); } bundle } pub fn get_bundles<'l>( &'l self, locales: Vec<LanguageIdentifier>, resource_ids: Vec<String>, ) -> impl Iterator<Item = FluentBundle<&FluentResource>> { let res_mgr = self; let mut ptr = 0; iter::from_fn(move || { locales.get(ptr).map(|locale| { ptr += 1; let mut bundle = FluentBundle::new(vec![locale]); for res_id in &resource_ids { let res = res_mgr.get_resource(&res_id, &locale.to_string()); bundle.add_resource(res).unwrap(); } bundle }) }) } }