Add support for inline string and number literals

finchie
Feb 11, 2024, 7:16 AM
BMUMO42ICN3GQW77KUE2GTJPOA77SFDXJ4NNDO5NA2VJS267OXZAC

Dependencies

  • [2] 3C3CHSY5 Implement `to_syn` for groups containing simple text messages
  • [3] O77KA6C4 Create `fluent_embed` crate

Change contents

  • replacement in fluent_embed/src/lib.rs at line 1
    [3.74][2.0:68]()
    use fluent_syntax::ast::{Entry, Message, PatternElement, Resource};
    [3.74]
    [2.68]
    use fluent_syntax::ast::{
    Entry, Expression, InlineExpression, Message, Pattern, PatternElement, Resource,
    };
    use quote::quote;
  • replacement in fluent_embed/src/lib.rs at line 20
    [2.225][2.225:554]()
    Self::Message(message) => message.value.as_ref().map_or_else(
    || parse_quote! { () },
    |pattern| {
    let parsed_patterns = pattern.elements.iter().map(match_pattern_element);
    parse_quote! { #(#parsed_patterns)+* }
    },
    ),
    [2.225]
    [2.554]
    Self::Message(message) => message
    .value
    .as_ref()
    .map_or_else(|| parse_quote!(()), match_pattern),
  • edit in fluent_embed/src/lib.rs at line 58
    [3.999]
    [2.797]
    fn match_pattern<'resource>(pattern: &'resource Pattern<&'resource str>) -> syn::Expr {
    let mut format_body = proc_macro2::TokenStream::new();
    let mut format_arguments = proc_macro2::TokenStream::new();
    for element in &pattern.elements {
    match element {
    PatternElement::TextElement { value } => format_body.extend(quote!(#value)),
    PatternElement::Placeable { expression } => {
    let expression = match_placeable_expression(&expression);
    format_body.extend(quote!({}));
    format_arguments.extend(quote!(#expression));
    }
    }
    }
  • replacement in fluent_embed/src/lib.rs at line 74
    [2.798][2.798:899]()
    fn match_pattern_element<'resource>(
    pattern_element: &'resource PatternElement<&'resource str>,
    [2.798]
    [2.899]
    let format_body_literal = proc_macro2::Literal::string(format_body.to_string().as_str());
    parse_quote!(format!(#format_body_literal, #format_arguments))
    }
    fn match_placeable_expression<'resource>(
    expression: &'resource Expression<&'resource str>,
    ) -> syn::Expr {
    match expression {
    Expression::Select { selector, variants } => match_inline_expression(selector),
    Expression::Inline(expression) => match_inline_expression(expression),
    }
    }
    fn match_inline_expression<'resource>(
    expression: &'resource InlineExpression<&'resource str>,
  • replacement in fluent_embed/src/lib.rs at line 91
    [2.916][2.916:1018]()
    match pattern_element {
    PatternElement::TextElement { value } => parse_quote! { #value },
    [2.916]
    [2.1018]
    match expression {
    InlineExpression::StringLiteral { value } => {
    let string_literal = proc_macro2::Literal::string(value);
    parse_quote!(#string_literal)
    }
    InlineExpression::NumberLiteral { value } => {
    // FIXME: i128 is "good enough" for now but an incorrect representation!
    // e.g. decimals not supported
    let parsed_value = i128::from_str_radix(value, 10).unwrap();
    let number_literal = proc_macro2::Literal::i128_unsuffixed(parsed_value);
    parse_quote!(#number_literal)
    }
  • replacement in fluent_embed/examples/groups.rs at line 5
    [3.1095][3.1095:1131]()
    let ftl = r"greeting = hello!";
    [3.1095]
    [3.1131]
    let ftl = r#"test-message = the number is { 2 }! what a { "cool" } number :)"#;