fang_derive_error/
lib.rs

1extern crate proc_macro;
2use proc_macro::TokenStream;
3use quote::quote;
4use syn::DeriveInput;
5
6#[proc_macro_derive(ToFangError)]
7pub fn implement_fang_error(input: TokenStream) -> TokenStream {
8    // returing a simple TokenStream for Struct
9    let ast = syn::parse(input).unwrap();
10
11    implement_fang_error_macro(&ast)
12}
13
14fn implement_fang_error_macro(ast: &DeriveInput) -> TokenStream {
15    let name = &ast.ident;
16
17    let gen = quote! {
18        impl From<#name> for FangError where #name : Debug {
19            fn from(error: #name) ->  Self {
20                FangError { description: format!("{error:?}") }
21            }
22        }
23    };
24
25    gen.into()
26}