@@ -84,7 +84,7 @@ fn extract_custom_message_format_from_meta_list(
8484 } ) ,
8585 #[ cfg( feature = "fluent" ) ]
8686 message_type @ ( MetaListCustomMessage :: I18n | MetaListCustomMessage :: Fluent ) => {
87- get_fluent_message ( message_type, path, & message_fn_define)
87+ get_fluent_message_from_meta ( message_type, path, & message_fn_define)
8888 }
8989 }
9090}
@@ -96,6 +96,11 @@ fn extract_custom_message_format_from_name_value(
9696 match custom_message_type {
9797 MetaNameValueCustomMessage :: Message => get_message ( & name_value. value ) ,
9898 MetaNameValueCustomMessage :: MessageFn => get_message_fn_from_meta_name_value ( name_value) ,
99+ #[ cfg( feature = "fluent" ) ]
100+ MetaNameValueCustomMessage :: MessageL10n => match & name_value. value {
101+ syn:: Expr :: Call ( call) => get_fluent_message_from_call_expr ( call) ,
102+ _ => Err ( vec ! [ crate :: Error :: l10n_need_fn_call( & name_value. value) ] ) ,
103+ } ,
99104 }
100105}
101106
@@ -151,7 +156,7 @@ fn get_message(expr: &syn::Expr) -> Result<WithWarnings<MessageFormat>, crate::E
151156}
152157
153158#[ cfg( feature = "fluent" ) ]
154- fn get_fluent_message (
159+ fn get_fluent_message_from_meta (
155160 message_type : & MetaListCustomMessage ,
156161 path : & syn:: Path ,
157162 fn_define : & CommaSeparatedNestedMetas ,
@@ -210,6 +215,54 @@ fn get_fluent_message(
210215 }
211216}
212217
218+ #[ cfg( feature = "fluent" ) ]
219+ fn get_fluent_message_from_call_expr (
220+ fn_define : & syn:: ExprCall ,
221+ ) -> Result < WithWarnings < MessageFormat > , crate :: Errors > {
222+ use quote:: ToTokens ;
223+
224+ if fn_define. func . to_token_stream ( ) . to_string ( ) != "fluent" {
225+ Err ( vec ! [ crate :: Error :: l10n_fn_name_not_allow( & fn_define. func) ] ) ?
226+ } ;
227+
228+ let mut fn_args = fn_define. args . iter ( ) ;
229+ let fluent_id = match fn_args. next ( ) {
230+ Some ( syn:: Expr :: Lit ( syn:: ExprLit {
231+ lit : syn:: Lit :: Str ( fluent_id) ,
232+ ..
233+ } ) ) => fluent_id,
234+ Some ( expr) => Err ( vec ! [ crate :: Error :: fluent_id_must_be_str_lit( expr) ] ) ?,
235+ None => Err ( vec ! [ crate :: Error :: fluent_id_not_found(
236+ & fn_define. paren_token,
237+ ) ] ) ?,
238+ } ;
239+
240+ let mut errors = vec ! [ ] ;
241+ let fluent_args = TokenStream :: from_iter ( fn_args. filter_map ( |arg| {
242+ if let syn:: Expr :: Assign ( assign) = arg {
243+ let key = & assign. left . to_token_stream ( ) . to_string ( ) ;
244+ let value = & assign. right ;
245+ Some ( quote ! ( ( #key, :: serde_valid:: export:: fluent:: FluentValue :: from( #value) ) ) )
246+ } else {
247+ errors. push ( crate :: Error :: fluent_allow_arg ( arg) ) ;
248+ None
249+ }
250+ } ) ) ;
251+
252+ if errors. is_empty ( ) {
253+ Ok ( WithWarnings :: new ( quote ! (
254+ :: serde_valid:: validation:: error:: Format :: Fluent (
255+ :: serde_valid:: fluent:: Message {
256+ id: #fluent_id,
257+ args: vec![ #fluent_args]
258+ }
259+ )
260+ ) ) )
261+ } else {
262+ Err ( errors)
263+ }
264+ }
265+
213266#[ cfg( feature = "fluent" ) ]
214267fn get_fluent_id ( nested_meta : & NestedMeta ) -> Option < & syn:: LitStr > {
215268 match nested_meta {
0 commit comments