narrative-macros 0.5.0

Procedural macros for the narrative crate
Documentation
use proc_macro2::TokenStream;
use quote::quote;

pub fn generate(input: &syn::ItemEnum) -> TokenStream {
    let derive = super::derive_attr::generate();
    let _ = &input.attrs;
    let ident = &input.ident;
    let generics = &input.generics;
    let variants = &input.variants;
    quote! {
        #derive
        pub enum #ident #generics { #variants }
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_enum_visibility() {
        let input = syn::parse_quote! {
            enum User {
                Admin,
                Developer(String),
                Normal {
                    id: i32,
                    name: String,
                }
            }
        };
        let actual = generate(&input);
        let expected = quote! {
            #[derive(Clone, Debug, PartialEq, narrative::serde::Serialize)]
            #[serde(crate = "narrative::serde")]
            pub enum User {
                Admin,
                Developer(String),
                Normal {
                    id: i32,
                    name: String,
                }
            }
        };
        assert_eq!(actual.to_string(), expected.to_string());
    }

    #[test]
    fn test_enum_keep_variants_attributes() {
        let input = syn::parse_quote! {
            enum User {
                #[keep_this]
                #[keep_this2]
                Admin,
                Developer(String),
                Normal {
                    id: i32,
                    name: String,
                }
            }
        };
        let actual = generate(&input);
        let expected = quote! {
            #[derive(Clone, Debug, PartialEq, narrative::serde::Serialize)]
            #[serde(crate = "narrative::serde")]
            pub enum User {
                #[keep_this]
                #[keep_this2]
                Admin,
                Developer(String),
                Normal {
                    id: i32,
                    name: String,
                }
            }
        };
        assert_eq!(actual.to_string(), expected.to_string());
    }

    #[test]
    fn test_enum_keep_generics() {
        let input = syn::parse_quote! {
            enum User<T, U> {
                Admin,
                Developer(String),
                Normal {
                    id: i32,
                    name: String,
                }
            }
        };
        let actual = generate(&input);
        let expected = quote! {
            #[derive(Clone, Debug, PartialEq, narrative::serde::Serialize)]
            #[serde(crate = "narrative::serde")]
            pub enum User<T, U> {
                Admin,
                Developer(String),
                Normal {
                    id: i32,
                    name: String,
                }
            }
        };
        assert_eq!(actual.to_string(), expected.to_string());
    }
}