Skip to main content

es_fluent_manager_core/embedded_localization/
bundle.rs

1use fluent_bundle::FluentError;
2use unic_langid::LanguageIdentifier;
3
4#[derive(Clone, Debug, Eq, PartialEq)]
5pub struct BundleBuildError {
6    module_name: String,
7    language: LanguageIdentifier,
8    diagnostics: Vec<String>,
9}
10
11impl BundleBuildError {
12    pub(super) fn from_add_errors(
13        module_name: &str,
14        language: &LanguageIdentifier,
15        add_errors: Vec<Vec<FluentError>>,
16    ) -> Self {
17        let diagnostics = add_errors
18            .into_iter()
19            .enumerate()
20            .map(|(resource_index, errors)| {
21                let messages = errors
22                    .into_iter()
23                    .map(|error| error.to_string())
24                    .collect::<Vec<_>>()
25                    .join("; ");
26                format!("resource #{resource_index}: {messages}")
27            })
28            .collect();
29
30        Self {
31            module_name: module_name.to_string(),
32            language: language.clone(),
33            diagnostics,
34        }
35    }
36
37    pub fn module_name(&self) -> &str {
38        &self.module_name
39    }
40
41    pub fn language(&self) -> &LanguageIdentifier {
42        &self.language
43    }
44
45    pub fn diagnostics(&self) -> &[String] {
46        &self.diagnostics
47    }
48}
49
50impl std::fmt::Display for BundleBuildError {
51    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
52        write!(
53            f,
54            "failed to build a Fluent bundle for module '{}' and language '{}': {}",
55            self.module_name,
56            self.language,
57            self.diagnostics.join(" | ")
58        )
59    }
60}
61
62impl std::error::Error for BundleBuildError {}