bevy_fluent/systems/parameters/
mod.rs

1//! System parameters
2//!
3//! Any entity located directly in this module is
4//! [`SystemParam`](bevy::ecs::system::SystemParam).
5
6use crate::{exts::fluent::BundleExt, BundleAsset, Locale, Localization, ResourceAsset};
7use bevy::{asset::LoadedFolder, ecs::system::SystemParam, prelude::*};
8use std::{any::TypeId, collections::HashMap};
9
10/// Localization builder
11#[derive(SystemParam)]
12pub struct LocalizationBuilder<'w> {
13    loaded_folders: Res<'w, Assets<LoadedFolder>>,
14    assets: Res<'w, Assets<BundleAsset>>,
15    locale: Res<'w, Locale>,
16}
17
18impl LocalizationBuilder<'_> {
19    pub fn build(&self, handle: &Handle<LoadedFolder>) -> Localization {
20        let mut localization = Localization::new();
21        if let Some(loaded_folder) = self.loaded_folders.get(handle) {
22            let locale_entries: HashMap<_, _> = loaded_folder
23                .handles
24                .iter()
25                .filter_map(|untyped_handle| {
26                    if untyped_handle.type_id() != TypeId::of::<BundleAsset>() {
27                        if untyped_handle.type_id() != TypeId::of::<ResourceAsset>() {
28                            warn!(
29                                r#""{:?}" locale folder contains not only `BundleAsset` or `ResourceAsset` "{:?}"."#,
30                                handle.path(), untyped_handle.path()
31                            );
32                        }
33                        return None;
34                    }
35                    // TODO
36                    let typed_handle = untyped_handle.clone().typed();
37                    if let Some(asset) = self.assets.get(&typed_handle) {
38                        Some((asset.locale(), Entry { handle: typed_handle, asset }))
39                    } else {
40                        error!(
41                            "{:?} `BundleAsset` didn't receive.",
42                            typed_handle.path(),
43                        );
44                        None
45                    }
46                })
47                .collect();
48            let locales = self.locale.fallback_chain(locale_entries.keys().cloned());
49            for locale in locales {
50                localization.insert(&locale_entries[locale].handle, locale_entries[locale].asset);
51            }
52        } else {
53            error!("{:?} locale folder didn't load.", handle.path());
54        }
55        localization
56    }
57}
58
59struct Entry<'a> {
60    handle: Handle<BundleAsset>,
61    asset: &'a BundleAsset,
62}