Skip to content
Snippets Groups Projects
implement.rs 837 B
Newer Older
  • Learn to ignore specific revisions
  • use proc_macro::{Span, TokenStream};
    
    Jason Volk's avatar
    Jason Volk committed
    use quote::quote;
    
    use syn::{Error, ItemFn, Meta, Path};
    use utils::get_named_generics;
    
    use crate::{utils, Result};
    
    Jason Volk's avatar
    Jason Volk committed
    pub(super) fn implement(item: ItemFn, args: &[Meta]) -> Result<TokenStream> {
    
    	let generics = get_named_generics(args, "generics")?;
    	let receiver = get_receiver(args)?;
    	let params = get_named_generics(args, "params")?;
    
    Jason Volk's avatar
    Jason Volk committed
    	let input = item;
    
    	let out = quote! {
    
    		impl #generics #receiver #params {
    
    Jason Volk's avatar
    Jason Volk committed
    			#input
    
    Jason Volk's avatar
    Jason Volk committed
    	Ok(out.into())
    
    
    fn get_receiver(args: &[Meta]) -> Result<Path> {
    	let receiver = &args
    		.first()
    		.ok_or_else(|| Error::new(Span::call_site().into(), "Missing required argument to receiver"))?;
    
    	let Meta::Path(receiver) = receiver else {
    		return Err(Error::new(Span::call_site().into(), "First argument is not path to receiver"));
    	};
    
    	Ok(receiver.clone())
    }