orion-error-derive 0.8.0

Derive macros for orion-error
Documentation
fn variant_pattern(variant: &Variant) -> TokenStream2 {
    let ident = &variant.ident;
    match &variant.fields {
        Fields::Unit => quote! { Self::#ident },
        Fields::Unnamed(_) => quote! { Self::#ident(..) },
        Fields::Named(_) => quote! { Self::#ident { .. } },
    }
}

fn transparent_variant_pattern(variant: &Variant) -> Result<(TokenStream2, TokenStream2)> {
    let ident = &variant.ident;
    match &variant.fields {
        Fields::Unnamed(fields) if fields.unnamed.len() == 1 => {
            Ok((quote! { Self::#ident(__inner) }, quote! { __inner }))
        }
        Fields::Named(fields) if fields.named.len() == 1 => {
            let field = fields
                .named
                .iter()
                .next()
                .and_then(|field| field.ident.as_ref())
                .unwrap();
            Ok((quote! { Self::#ident { #field } }, quote! { #field }))
        }
        _ => Err(Error::new(
            variant.span(),
            "#[orion_error(transparent)] requires exactly one field",
        )),
    }
}

fn transparent_struct_binding(fields: &Fields) -> Result<TokenStream2> {
    match fields {
        Fields::Unnamed(fields) if fields.unnamed.len() == 1 => Ok(quote! { __inner }),
        Fields::Named(fields) if fields.named.len() == 1 => {
            let field = fields
                .named
                .iter()
                .next()
                .and_then(|field| field.ident.as_ref())
                .unwrap();
            Ok(quote! { #field })
        }
        _ => Err(Error::new(
            fields.span(),
            "#[orion_error(transparent)] requires exactly one field",
        )),
    }
}

fn struct_pattern(ident: &syn::Ident, fields: &Fields) -> TokenStream2 {
    match fields {
        Fields::Unit => quote! { #ident },
        Fields::Unnamed(_) => quote! { #ident(__inner) },
        Fields::Named(fields) => {
            let field = fields
                .named
                .iter()
                .next()
                .and_then(|field| field.ident.as_ref());
            quote! { #ident { #field } }
        }
    }
}