beet_flow_macros 0.0.6

Bevy Everywhere
Documentation
use extend::ext;
use proc_macro2::TokenStream;
use quote::quote;
use syn::Result;

#[ext(name=TokenStreamIterExt)]
pub impl<T: Iterator<Item = TokenStream>> T {
	fn collect_comma_punct(self) -> TokenStream {
		let mut out = TokenStream::new();
		for (i, item) in self.enumerate() {
			if i == 0 {
				out.extend(quote! {#item});
			} else {
				out.extend(quote! {,#item});
			}
		}
		out
	}
}

#[ext(name=ResultOptionTokenStreamIterExt)]
pub impl<T: Iterator<Item = Result<Option<TokenStream>>>> T {
	fn collect_tokens(self) -> Result<TokenStream> {
		let out = self
			.collect::<Result<Vec<_>>>()?
			.into_iter()
			.filter_map(|x| x)
			.collect_comma_punct();
		Ok(out)
	}
}


#[ext(name=TokenStreamVecExt)]
pub impl<T: quote::ToTokens> Vec<T> {
	fn collect_comma_punct(&self) -> TokenStream {
		let mut out = TokenStream::new();
		for (i, item) in self.into_iter().enumerate() {
			if i == 0 {
				out.extend(quote! {#item});
			} else {
				out.extend(quote! {,#item});
			}
		}
		out
	}
}