debate-derive 1.0.0

derive macro for the `debate` CLI arguments parser
Documentation
mod common;
pub mod enumeration;
pub mod structure;
pub mod value;

use proc_macro2::TokenStream as TokenStream2;
use syn::{DeriveInput, spanned::Spanned as _};

use crate::generics::compute_generics;

use self::enumeration::derive_usage_enum;
use self::structure::derive_usage_struct;

pub fn derive_usage_result(item: TokenStream2) -> syn::Result<TokenStream2> {
    let input: DeriveInput = syn::parse2(item)?;
    let (_, type_lifetime) = compute_generics(&input.generics)?;

    match input.data {
        syn::Data::Struct(ref data) => derive_usage_struct(
            &input.ident,
            match data.fields {
                syn::Fields::Named(ref fields) => &fields.named,
                syn::Fields::Unnamed(ref fields) => &fields.unnamed,
                syn::Fields::Unit => {
                    return Err(syn::Error::new(
                        input.span(),
                        "can't derive `Usage` on a unit struct",
                    ));
                }
            },
            type_lifetime.as_ref(),
            &input.attrs,
        ),
        syn::Data::Enum(data) => derive_usage_enum(
            &input.ident,
            &data.variants,
            type_lifetime.as_ref(),
            &input.attrs,
        ),
        syn::Data::Union(_) => Err(syn::Error::new(
            input.span(),
            "can't derive `FromArgs` on a union",
        )),
    }
}