Move `Group::derive_enum` to new `crate::parse_macro` module
Dependencies
- [2]
D652S2N3Rename `parse` module to `parse_fluent` - [3]
56F2YE6HUse `prettyplease` to format macro output - [4]
O77KA6C4Create `fluent_embed` crate - [5]
5TEX4MNUSplit `fluent_embed` into `group` and `parse` modules - [6]
3C3CHSY5Implement `to_syn` for groups containing simple text messages - [7]
K4XW4OBWCreate derive macro helper function for simple enums - [*]
UOMQT7LTAdd 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-matchinglet 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
use heck::{ToKebabCase, ToSnakeCase};use quote::{format_ident, quote}; - replacement in fluent_embed/src/group.rs at line 11
children: Vec<GroupEntry<'resource>>,pub children: Vec<GroupEntry<'resource>>, - replacement in fluent_embed/src/group.rs at line 15
fn to_syn(&self) -> syn::Expr {pub fn to_syn(&self) -> syn::Expr { - replacement in fluent_embed/src/group.rs at line 24
fn id(&self) -> &'resource str {pub fn id(&self) -> &'resource str { - edit in fluent_embed/src/group.rs at line 51
}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-matchinglet 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
use fluent_embed::Group;use fluent_embed::{derive_enum, Group}; - replacement in fluent_embed/examples/groups.rs at line 26
let file_contents = group.derive_enum(source.ident, data);let file_contents = derive_enum(group, source.ident, data);