fluent_content/
content.rs

1use crate::Request;
2use fluent::{bundle::FluentBundle, memoizer::MemoizerKind, FluentArgs, FluentResource};
3use std::borrow::Borrow;
4use tracing::error;
5
6/// Content
7pub trait Content<'a, T: Into<Request<'a, U>>, U: Borrow<FluentArgs<'a>>> {
8    /// Request message content
9    fn content(&self, request: T) -> Option<String>;
10}
11
12impl<'a, T, U, V, W> Content<'a, T, U> for FluentBundle<V, W>
13where
14    T: Into<Request<'a, U>>,
15    U: Borrow<FluentArgs<'a>>,
16    V: Borrow<FluentResource>,
17    W: MemoizerKind,
18{
19    fn content(&self, request: T) -> Option<String> {
20        let request = request.into();
21        let request = request.borrow();
22        let message = self.get_message(request.id)?;
23        let pattern = match request.attr {
24            Some(key) => message.get_attribute(key)?.value(),
25            None => message.value()?,
26        };
27        let mut errors = Vec::new();
28        let content = self
29            .format_pattern(
30                pattern,
31                request.args.as_ref().map(Borrow::borrow),
32                &mut errors,
33            )
34            .to_string();
35        for error in &errors {
36            error!(%error);
37        }
38        Some(content)
39    }
40}