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 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}