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_core::{Type, TypeParseError};
use quote::quote;
use syn::{
    parse::{Parse, ParseStream},
    parse_macro_input, Error as SynError, LitStr,
};

struct GenTypeInput {
    r#type: Type,
}
impl Parse for GenTypeInput {
    fn parse(input: ParseStream) -> Result<Self, SynError> {
        let r#type = input.parse::<LitStr>()?;

        let r#type: Type = r#type
            .value()
            .parse()
            .map_err(|err: TypeParseError| SynError::new_spanned(r#type, err.to_string()))?;

        Ok(Self { r#type })
    }
}

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

    let r#type = input.r#type;

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