attrimpl 0.5.0

The crate provides attributes to automatically implement common traits and reduce boilerplate code.
Documentation
use syn::parse::discouraged::Speculative;

use crate::{syn_item_enum::SynItemEnum, syn_item_struct::SynItemStruct};

pub enum Item {
    Struct(SynItemStruct),
    Enum(SynItemEnum),
}

impl syn::parse::Parse for Item {
    fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> {
        let fork_struct = input.fork();
        let fork_enum = input.fork();

        if let Ok(item_struct) = fork_struct.parse::<syn::ItemStruct>() {
            input.advance_to(&fork_struct);
            Ok(Item::Struct(SynItemStruct::parse(item_struct)?))
        } else if let Ok(item_enum) = fork_enum.parse::<syn::ItemEnum>() {
            input.advance_to(&fork_enum);
            Ok(Item::Enum(SynItemEnum::parse(item_enum)?))
        } else {
            Err(syn::Error::new(
                input.span(),
                "expected a struct or an enum",
            ))
        }
    }
}

impl quote::ToTokens for Item {
    fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) {
        match self {
            Item::Struct(item_struct) => {
                item_struct.to_tokens(tokens);
            }
            Item::Enum(item_enum) => {
                item_enum.to_tokens(tokens);
            }
        }
    }
}