fluent_content/
content.rs1use crate::Request;
2use fluent::{bundle::FluentBundle, memoizer::MemoizerKind, FluentArgs, FluentResource};
3use std::borrow::Borrow;
4use tracing::error;
5
6pub trait Content<'a, T: Into<Request<'a, U>>, U: Borrow<FluentArgs<'a>>> {
8 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}