fluent_bundle/
concurrent.rs

1use intl_memoizer::{concurrent::IntlLangMemoizer, Memoizable};
2use rustc_hash::FxHashMap;
3use unic_langid::LanguageIdentifier;
4
5use crate::memoizer::MemoizerKind;
6use crate::types::FluentType;
7
8/// Specialized [`FluentBundle`](crate::bundle::FluentBundle) over
9/// concurrent [`IntlLangMemoizer`].
10///
11/// A concurrent `FluentBundle` can be constructed with the
12/// [`FluentBundle::new_concurrent`] method.
13///
14/// See [`FluentBundle`](crate::FluentBundle) for the non-concurrent specialization.
15pub type FluentBundle<R> = crate::bundle::FluentBundle<R, IntlLangMemoizer>;
16
17impl<R> FluentBundle<R> {
18    /// A constructor analogous to [`FluentBundle::new`] but operating
19    /// on a concurrent version of [`IntlLangMemoizer`] over [`Mutex`](std::sync::Mutex).
20    ///
21    /// # Example
22    ///
23    /// ```
24    /// use fluent_bundle::concurrent::FluentBundle;
25    /// use fluent_bundle::FluentResource;
26    /// use unic_langid::langid;
27    ///
28    /// let langid_en = langid!("en-US");
29    /// let mut bundle: FluentBundle<FluentResource> =
30    ///     FluentBundle::new_concurrent(vec![langid_en]);
31    /// ```
32    pub fn new_concurrent(locales: Vec<LanguageIdentifier>) -> Self {
33        let first_locale = locales.get(0).cloned().unwrap_or_default();
34        Self {
35            locales,
36            resources: vec![],
37            entries: FxHashMap::default(),
38            intls: IntlLangMemoizer::new(first_locale),
39            use_isolating: true,
40            transform: None,
41            formatter: None,
42        }
43    }
44}
45
46impl MemoizerKind for IntlLangMemoizer {
47    fn new(lang: LanguageIdentifier) -> Self
48    where
49        Self: Sized,
50    {
51        Self::new(lang)
52    }
53
54    fn with_try_get_threadsafe<I, R, U>(&self, args: I::Args, cb: U) -> Result<R, I::Error>
55    where
56        Self: Sized,
57        I: Memoizable + Send + Sync + 'static,
58        I::Args: Send + Sync + 'static,
59        U: FnOnce(&I) -> R,
60    {
61        self.with_try_get(args, cb)
62    }
63
64    fn stringify_value(&self, value: &dyn FluentType) -> std::borrow::Cow<'static, str> {
65        value.as_string_threadsafe(self)
66    }
67}