1extern crate proc_macro;
2use proc_macro::TokenStream;
3use quote::quote;
4use syn;
5
6#[proc_macro_derive(CType)]
7pub fn ctype_derive(input: TokenStream) -> TokenStream {
8 let ast = syn::parse(input).unwrap();
9 impl_ctype(&ast)
10}
11
12fn impl_ctype(ast: &syn::DeriveInput) -> TokenStream {
13 let name = &ast.ident;
14 let gen = quote! {
15 impl CType for #name {
16 fn to_cstring(&self) -> std::ffi::CString {
17 let string = &self.to_string();
18 std::ffi::CString::new(string).unwrap()
19 }
20 }
21 };
22 gen.into()
23}
24
25#[proc_macro_derive(Dexalt)]
26pub fn dexalt_derive(input: TokenStream) -> TokenStream {
27 let ast = syn::parse(input).unwrap();
28 impl_dexalt(&ast)
29}
30
31fn impl_dexalt(ast: &syn::DeriveInput) -> TokenStream {
32 let name = &ast.ident;
33 let gen = quote! {
34 impl Dexalt for #name {
35 fn to_json(&self) -> serde_json::Value {
36 let string = &self.to_string();
37 serde_json::from_str(string).unwrap()
38 }
39 }
40 };
41 gen.into()
42}