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 35 36 37 38 39 40
#[macro_use] extern crate quote; use proc_macro::TokenStream; #[proc_macro_derive(CouchDocument, attributes(serde))] pub fn derive_couch_doc(input: TokenStream) -> TokenStream { impl_derive_couch_doc(&syn::parse(input).unwrap()) } fn impl_derive_couch_doc(ast: &syn::DeriveInput) -> TokenStream { let name = &ast.ident; let gen = quote! { impl TypedCouchDocument for #name { fn get_id(&self) -> couch_rs::Cow<str> { couch_rs::Cow::from(&self._id) } fn get_rev(&self) -> couch_rs::Cow<str> { couch_rs::Cow::from(&self._rev) } fn set_id(&mut self, id: &str) { self._id = id.to_string(); } fn set_rev(&mut self, rev: &str) { self._rev = rev.to_string(); } fn merge(&mut self, other: &Self) { self.set_id(&other.get_id()); self.set_rev(&other.get_rev()); } } }; gen.into() }