class_list_macro 0.1.7

A reactive helper that ensures normalized class list strings in frontend frameworks like Leptos.
Documentation
use syn::parse::{Parse, ParseBuffer, ParseStream};

pub fn peek_any<T: Parse>(
	input: ParseStream,
	parse_original: bool,
) -> Option<(ParseBuffer, T)> {
	let finput = input.fork();
	if let Ok(any) = finput.parse::<T>() {
		if parse_original {
			_ = input.parse::<T>();
		}

		Some((finput, any))
	} else {
		None
	}
}

pub fn parse_until<T: Parse>(
	input: ParseStream,
	callback: fn(input: ParseStream) -> bool,
) -> syn::Result<Vec<T>> {
	let mut tokens = vec![];

	while !callback(input) && !input.is_empty() {
		let next = match peek_any::<T>(input, true) {
			Some(token) => token.1,
			None => {
				return Err(syn::Error::new(
					input.cursor().span(),
					format!("failed to parse until {:#?}", callback),
				));
			}
		};
		tokens.push(next);
	}

	Ok(tokens)
}