Create derive macro helper function for simple enums

finchie
Feb 11, 2024, 3:52 PM
K4XW4OBW5VWRCQZJNVV624E25SKRJPZ5WUXWVYHP6U7T7NPJFMFQC

Dependencies

  • [2] 56F2YE6H Use `prettyplease` to format macro output
  • [3] UOMQT7LT Add support for cardinal CLDR plural selectors
  • [4] MIHGKLME Fix generated `format!` macro call
  • [5] BMUMO42I Add support for inline string and number literals
  • [6] 3C3CHSY5 Implement `to_syn` for groups containing simple text messages
  • [7] O77KA6C4 Create `fluent_embed` crate

Change contents

  • replacement in fluent_embed/src/lib.rs at line 5
    [4.114][3.111:139]()
    use heck::ToUpperCamelCase;
    [4.114]
    [3.139]
    use heck::{ToKebabCase, ToUpperCamelCase};
  • edit in fluent_embed/src/lib.rs at line 28
    [4.570]
    [4.315]
    fn id(&self) -> &'resource str {
    match self {
    Self::Message(message) => message.id.name,
    }
    }
  • edit in fluent_embed/src/lib.rs at line 57
    [4.577]
    [4.577]
    pub fn derive_enum(
    &self,
    ident: syn::Ident,
    enum_data: syn::DataEnum,
    ) -> proc_macro2::TokenStream {
    let mut idents = Vec::with_capacity(enum_data.variants.len());
    let mut messages = Vec::with_capacity(enum_data.variants.len());
  • replacement in fluent_embed/src/lib.rs at line 66
    [4.578][4.0:61](),[4.61][4.639:796](),[4.639][4.639:796]()
    // TODO: turn this into a well-formed `match` expression
    pub fn to_syn(&self) -> Vec<syn::Expr> {
    self.children
    .iter()
    .map(GroupEntry::to_syn)
    .collect::<Vec<_>>()
    [4.578]
    [4.991]
    for variant in enum_data.variants {
    let kebab_case_ident = variant.ident.to_string().to_kebab_case();
    let message = self
    .children
    .iter()
    .find(|child| child.id() == kebab_case_ident)
    .unwrap();
    idents.push(variant.ident);
    messages.push(message.to_syn());
    }
    quote! {
    impl #ident {
    fn localize(&self) -> String {
    match self {
    #(Self::#idents => #messages),*
    }
    }
    }
    }
  • replacement in fluent_embed/examples/groups.rs at line 2
    [4.1082][4.1049:1067]()
    use quote::quote;
    [4.1082]
    [4.1082]
    use syn::parse_quote;
  • replacement in fluent_embed/examples/groups.rs at line 5
    [4.1095][3.2240:2456]()
    // Example from https://projectfluent.org/fluent/guide/selectors.html
    let ftl = r#"emails =
    { $unreadEmails ->
    [one] You have one unread email.
    *[other] You have { $unreadEmails } unread emails.
    }"#;
    [4.1095]
    [4.1131]
    let ftl = r#"first = one
    second = two"#;
  • replacement in fluent_embed/examples/groups.rs at line 10
    [4.1244][4.1068:1200]()
    let syn_expressions = group
    .to_syn()
    .iter()
    .map(|expr| quote! {#expr})
    .collect::<Vec<_>>();
    [4.1244]
    [4.1244]
    let source: syn::DeriveInput = parse_quote! {
    enum Test {
    First,
    Second,
    }
    };
  • replacement in fluent_embed/examples/groups.rs at line 18
    [4.1245][2.0:63]()
    let file_contents = quote! {
    #(#syn_expressions)*;
    [4.1245]
    [2.63]
    let data = match source.data {
    syn::Data::Enum(enum_data) => enum_data,
    _ => todo!(),
  • edit in fluent_embed/examples/groups.rs at line 23
    [2.71]
    [2.71]
    let file_contents = group.derive_enum(source.ident, data);