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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
extern crate proc_macro; mod create; mod methods; mod self_type; use darling::FromMeta; use proc_macro::TokenStream; use quote::quote; #[proc_macro_attribute] pub fn create(args: TokenStream, original: TokenStream) -> TokenStream { let original = syn::parse_macro_input!(original as syn::ItemStruct); let args = syn::parse_macro_input!(args as syn::AttributeArgs); let args = match create::Args::from_list(&args) { Ok(v) => v, Err(e) => { return e.write_errors().into(); } }; let mockable = create::Mockable::new(original, args); TokenStream::from(mockable) } #[proc_macro_attribute] pub fn methods(args: TokenStream, original: TokenStream) -> TokenStream { let original = syn::parse_macro_input!(original as syn::ItemImpl); let args = syn::parse_macro_input!(args as syn::AttributeArgs); let args = match methods::Args::from_list(&args) { Ok(v) => v, Err(e) => { return e.write_errors().into(); } }; match methods::Mockable::new(original, args) { Ok(mockable) => TokenStream::from(mockable), Err(e) => e.write_errors().into(), } } #[proc_macro] pub fn when(input: proc_macro::TokenStream) -> proc_macro::TokenStream { let expr = syn::parse_macro_input!(input as syn::ExprField); let base = expr.base; let method = match expr.member { syn::Member::Named(ident) => ident, syn::Member::Unnamed(member) => { return darling::Error::custom("Unnamed members cannot be called as methods") .with_span(&member) .write_errors() .into(); } }; let when = syn::Ident::new(&format!("_when_{}", method), proc_macro2::Span::call_site()); TokenStream::from(quote!( { #base.#when() })) }