mastrust_ls_lib_derive/
lib.rs1extern 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}