1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
extern crate proc_macro;

use golang_type_name_core::{TypeName, TypeNameParseError};
use quote::quote;
use syn::{
    parse::{Parse, ParseStream},
    parse_macro_input, Error as SynError, LitStr,
};

struct GenTypeNameInput {
    type_name: TypeName,
}
impl Parse for GenTypeNameInput {
    fn parse(input: ParseStream) -> Result<Self, SynError> {
        let type_name = input.parse::<LitStr>()?;

        let type_name: TypeName = type_name
            .value()
            .parse()
            .map_err(|err: TypeNameParseError| SynError::new_spanned(type_name, err.to_string()))?;

        Ok(Self { type_name })
    }
}

#[proc_macro]
pub fn gen_type_name(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
    let input = parse_macro_input!(input as GenTypeNameInput);

    let type_name = input.type_name;

    let output = quote!(#type_name);
    output.into()
}