Skip to main content

dexalt_lib_derive/
lib.rs

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}