errify-macros 0.3.0

Function error context provider (macros)
Documentation
use proc_macro2::TokenStream;
use proc_macro2_diagnostics::Diagnostic;
use quote::{quote, ToTokens};

use crate::{
    input::{ErrifyMacroArgs, ErrifyWithMacroArgs, Input},
    output::Output,
};

pub fn errify_impl(args: TokenStream, input: TokenStream) -> Result<TokenStream, Diagnostic> {
    let m = ErrifyMacro::from_ast(args, input)?;
    let res = quote! { #m };

    Ok(res)
}

struct ErrifyMacro {
    output: Output,
}

impl ErrifyMacro {
    pub fn from_ast(args: TokenStream, input: TokenStream) -> syn::Result<Self> {
        let args = syn::parse2::<ErrifyMacroArgs>(args)?;
        let input = syn::parse2::<Input>(input)?;

        let output = Output::from_ast(args.into(), input)?;
        Ok(Self { output })
    }
}

impl ToTokens for ErrifyMacro {
    fn to_tokens(&self, tokens: &mut TokenStream) {
        self.output.to_tokens(tokens)
    }
}

pub fn errify_with_impl(args: TokenStream, input: TokenStream) -> Result<TokenStream, Diagnostic> {
    let m = ErrifyWithMacro::from_ast(args, input)?;
    let res = quote! { #m };

    Ok(res)
}

struct ErrifyWithMacro {
    output: Output,
}

impl ErrifyWithMacro {
    pub fn from_ast(args: TokenStream, input: TokenStream) -> syn::Result<Self> {
        let args = syn::parse2::<ErrifyWithMacroArgs>(args)?;
        let input = syn::parse2::<Input>(input)?;

        let output = Output::from_ast(args.into(), input)?;
        Ok(Self { output })
    }
}

impl ToTokens for ErrifyWithMacro {
    fn to_tokens(&self, tokens: &mut TokenStream) {
        self.output.to_tokens(tokens)
    }
}