mastrust_ls_lib_derive/
lib.rs

1extern crate proc_macro;
2use proc_macro::TokenStream;
3use quote::quote;
4use syn;
5
6#[proc_macro_derive(Mastrust)]
7pub fn mastrust_derive(input: TokenStream) -> TokenStream {
8    let ast = syn::parse(input).unwrap();
9    impl_mastrust(&ast)
10}
11
12fn impl_mastrust(ast: &syn::DeriveInput) -> TokenStream {
13    let name = &ast.ident;
14    let gen = quote! {
15        impl Mastrust for #name {
16            fn to_cstring(&self) -> std::ffi::CString {
17                if let Ok(s) = self.to_str() {
18                    std::ffi::CString::new(s).unwrap()
19                } else if let Ok(s) = self.to_string() {
20                    std::ffi::CString::new(s).unwrap()
21                } else {
22                    panic!("Type does not implement `to_str` or `to_string`. Consider implementing `Display` or `ToString`.");
23                }
24            }
25
26            fn to_cstr(&self) -> &std::ffi::CStr {
27                if let Ok(s) = self.to_str() {
28                    std::ffi::CString::new(s).unwrap().as_c_str()
29                } else if let Ok(s) = self.to_string() {
30                    std::ffi::CString::new(s).unwrap().as_c_str()
31                } else {
32                    panic!("Type does not implement `to_str` or `to_string`. Consider implementing `Display` or `ToString`.");
33                }
34            }
35        }
36    };
37    gen.into()
38}