vouched-derive 0.2.0

Proc macros for vouched.
Documentation
use proc_macro2::TokenStream as TokenStream2;
use quote::quote;
use syn::Ident;

use crate::vouched::model::ErrorKind;

impl ErrorKind {
    pub(crate) fn variant(self, core: &TokenStream2) -> TokenStream2 {
        match self {
            Self::TooShort => quote! { TooShort(#core::TooShortError), },
            Self::TooLong => quote! { TooLong(#core::TooLongError), },
            Self::OutOfRangeInteger => quote! { OutOfRange(#core::OutOfRangeIntegerError), },
            Self::OutOfRangeFloat => quote! { OutOfRange(#core::OutOfRangeFloatError), },
            Self::InvalidChar => quote! { InvalidChar(#core::InvalidCharError), },
        }
    }

    pub(crate) fn display_arm(self, error_ident: &Ident) -> TokenStream2 {
        match self {
            Self::TooShort => {
                quote! { #error_ident::TooShort(e) => ::core::fmt::Display::fmt(e, f), }
            }
            Self::TooLong => {
                quote! { #error_ident::TooLong(e) => ::core::fmt::Display::fmt(e, f), }
            }
            Self::OutOfRangeInteger | Self::OutOfRangeFloat => {
                quote! { #error_ident::OutOfRange(e) => ::core::fmt::Display::fmt(e, f), }
            }
            Self::InvalidChar => {
                quote! { #error_ident::InvalidChar(e) => ::core::fmt::Display::fmt(e, f), }
            }
        }
    }

    pub(crate) fn source_arm(self, error_ident: &Ident) -> TokenStream2 {
        match self {
            Self::TooShort => {
                quote! { #error_ident::TooShort(e) => ::core::option::Option::Some(e), }
            }
            Self::TooLong => {
                quote! { #error_ident::TooLong(e) => ::core::option::Option::Some(e), }
            }
            Self::OutOfRangeInteger | Self::OutOfRangeFloat => {
                quote! { #error_ident::OutOfRange(e) => ::core::option::Option::Some(e), }
            }
            Self::InvalidChar => {
                quote! { #error_ident::InvalidChar(e) => ::core::option::Option::Some(e), }
            }
        }
    }

    pub(crate) fn as_method(self, error_ident: &Ident, core: &TokenStream2) -> TokenStream2 {
        match self {
            Self::TooShort => quote! {
                fn as_too_short(&self) -> ::core::option::Option<&#core::TooShortError> {
                    match self {
                        #error_ident::TooShort(e) => ::core::option::Option::Some(e),
                        _ => ::core::option::Option::None,
                    }
                }
            },
            Self::TooLong => quote! {
                fn as_too_long(&self) -> ::core::option::Option<&#core::TooLongError> {
                    match self {
                        #error_ident::TooLong(e) => ::core::option::Option::Some(e),
                        _ => ::core::option::Option::None,
                    }
                }
            },
            Self::OutOfRangeInteger => quote! {
                fn as_out_of_range_integer(&self) -> ::core::option::Option<&#core::OutOfRangeIntegerError> {
                    match self {
                        #error_ident::OutOfRange(e) => ::core::option::Option::Some(e),
                        _ => ::core::option::Option::None,
                    }
                }
            },
            Self::OutOfRangeFloat => quote! {
                fn as_out_of_range_float(&self) -> ::core::option::Option<&#core::OutOfRangeFloatError> {
                    match self {
                        #error_ident::OutOfRange(e) => ::core::option::Option::Some(e),
                        _ => ::core::option::Option::None,
                    }
                }
            },
            Self::InvalidChar => quote! {
                fn as_invalid_char(&self) -> ::core::option::Option<&#core::InvalidCharError> {
                    match self {
                        #error_ident::InvalidChar(e) => ::core::option::Option::Some(e),
                        _ => ::core::option::Option::None,
                    }
                }
            },
        }
    }
}