Move `Group::derive_enum` to new `crate::parse_macro` module

finchie
Feb 14, 2024, 8:00 AM
XGNME3WRU3MJDTFHUFJYARLVXWBZIH5ODBOIIFTXHNCBTZQH2R7QC

Dependencies

  • [2] D652S2N3 Rename `parse` module to `parse_fluent`
  • [3] 56F2YE6H Use `prettyplease` to format macro output
  • [4] O77KA6C4 Create `fluent_embed` crate
  • [5] 5TEX4MNU Split `fluent_embed` into `group` and `parse` modules
  • [6] 3C3CHSY5 Implement `to_syn` for groups containing simple text messages
  • [7] K4XW4OBW Create derive macro helper function for simple enums
  • [*] UOMQT7LT Add support for cardinal CLDR plural selectors

Change contents

  • file addition: parse_macro.rs (----------)
    [3.41]
    use crate::group::Group;
    use heck::{ToKebabCase, ToSnakeCase};
    use quote::{format_ident, quote};
    pub fn derive_enum(
    group: Group,
    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());
    for variant in enum_data.variants {
    let kebab_case_ident = variant.ident.to_string().to_kebab_case();
    let message = group
    .children
    .iter()
    .find(|child| child.id() == kebab_case_ident)
    .unwrap();
    let variant_ident = variant.ident;
    idents.push(match variant.fields {
    syn::Fields::Named(fields) => {
    // Get the name of each field for pattern-matching
    let field_idents = fields
    .named
    .iter()
    .map(|field| field.ident.as_ref().unwrap())
    .map(|ident| format_ident!("{}", ident.to_string().to_snake_case()));
    quote!(#variant_ident { #(#field_idents),* })
    }
    syn::Fields::Unnamed(_) => todo!(),
    syn::Fields::Unit => quote!(#variant_ident),
    });
    messages.push(message.to_syn());
    }
    quote! {
    impl #ident {
    fn localize(&self, plural_rules: &::icu_plurals::PluralRules) -> String {
    match self {
    #(Self::#idents => #messages),*
    }
    }
    }
    }
    }
  • edit in fluent_embed/src/lib.rs at line 3
    [2.912]
    [9.1386]
    mod parse_macro;
  • edit in fluent_embed/src/lib.rs at line 6
    [3.3509]
    pub use parse_macro::derive_enum;
  • edit in fluent_embed/src/group.rs at line 2
    [3.3596][3.3596:3668]()
    use heck::{ToKebabCase, ToSnakeCase};
    use quote::{format_ident, quote};
  • replacement in fluent_embed/src/group.rs at line 11
    [3.3840][3.3840:3882]()
    children: Vec<GroupEntry<'resource>>,
    [3.3840]
    [3.3882]
    pub children: Vec<GroupEntry<'resource>>,
  • replacement in fluent_embed/src/group.rs at line 15
    [3.3925][3.3925:3961]()
    fn to_syn(&self) -> syn::Expr {
    [3.3925]
    [3.3961]
    pub fn to_syn(&self) -> syn::Expr {
  • replacement in fluent_embed/src/group.rs at line 24
    [3.4181][3.4181:4218]()
    fn id(&self) -> &'resource str {
    [3.4181]
    [3.4218]
    pub fn id(&self) -> &'resource str {
  • edit in fluent_embed/src/group.rs at line 51
    [3.4986][3.4986:6608]()
    }
    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());
    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();
    let variant_ident = variant.ident;
    idents.push(match variant.fields {
    syn::Fields::Named(fields) => {
    // Get the name of each field for pattern-matching
    let field_idents = fields
    .named
    .iter()
    .map(|field| field.ident.as_ref().unwrap())
    .map(|ident| format_ident!("{}", ident.to_string().to_snake_case()));
    quote!(#variant_ident { #(#field_idents),* })
    }
    syn::Fields::Unnamed(_) => todo!(),
    syn::Fields::Unit => quote!(#variant_ident),
    });
    messages.push(message.to_syn());
    }
    quote! {
    impl #ident {
    fn localize(&self, plural_rules: &::icu_plurals::PluralRules) -> String {
    match self {
    #(Self::#idents => #messages),*
    }
    }
    }
    }
  • replacement in fluent_embed/examples/groups.rs at line 1
    [3.1056][3.1057:1082]()
    use fluent_embed::Group;
    [3.1056]
    [3.1090]
    use fluent_embed::{derive_enum, Group};
  • replacement in fluent_embed/examples/groups.rs at line 26
    [3.71][3.1394:1457]()
    let file_contents = group.derive_enum(source.ident, data);
    [3.71]
    [3.1457]
    let file_contents = derive_enum(group, source.ident, data);