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
use proc_macro2::Span; use syn::parse::{Parse, ParseStream}; use syn::punctuated::Punctuated; pub fn use_crate(name: &str) -> syn::Ident { let krate = proc_macro_crate::crate_name(name).unwrap_or_else(|_| "crate".into()); syn::Ident::new(&krate, Span::call_site()) } #[derive(Debug)] pub struct Attrs<A> { pub paren: syn::token::Paren, pub attrs: Punctuated<A, syn::token::Comma>, } impl<A: Parse> Parse for Attrs<A> { fn parse(input: ParseStream) -> syn::Result<Self> { let content; let paren = syn::parenthesized!(content in input); let attrs = content.parse_terminated(A::parse)?; Ok(Self { paren, attrs }) } } #[derive(Debug)] pub struct Attr<K, V> { pub key: K, pub eq: syn::token::Eq, pub value: V, } impl<K: Parse, V: Parse> Parse for Attr<K, V> { fn parse(input: ParseStream) -> syn::Result<Self> { Ok(Self { key: input.parse()?, eq: input.parse()?, value: input.parse()?, }) } } #[cfg(test)] pub(crate) fn assert_proc_macro( result: proc_macro2::TokenStream, expected: proc_macro2::TokenStream, ) { let result = result.to_string(); let expected = expected.to_string(); pretty_assertions::assert_eq!(result, expected); }