1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
use proc_macro::TokenStream;
use quote::quote;
use syn::Error;

#[derive(Copy, Clone)]
pub enum Kind {
    Enum,
    Match,
    Struct,
    Let,
}

pub fn emit(err: &Error, kind: Kind, output: TokenStream) -> TokenStream {
    let err = err.to_compile_error();
    let output = proc_macro2::TokenStream::from(output);

    let expanded = match kind {
        Kind::Enum | Kind::Let | Kind::Struct => quote!(#err #output),
        Kind::Match => quote!({ #err #output }),
    };

    TokenStream::from(expanded)
}