Path: blob/main/crates/bevy_reflect/derive/src/attribute_parser.rs
6599 views
use syn::{1parse::{Parse, ParseStream, Peek},2punctuated::Punctuated,3};45/// Returns a [`syn::parse::Parser`] which parses a stream of zero or more occurrences of `T`6/// separated by punctuation of type `P`, with optional trailing punctuation.7///8/// This is functionally the same as [`Punctuated::parse_terminated`],9/// but accepts a closure rather than a function pointer.10pub(crate) fn terminated_parser<T, P, F: FnMut(ParseStream) -> syn::Result<T>>(11terminator: P,12mut parser: F,13) -> impl FnOnce(ParseStream) -> syn::Result<Punctuated<T, P::Token>>14where15P: Peek,16P::Token: Parse,17{18let _ = terminator;19move |stream: ParseStream| {20let mut punctuated = Punctuated::new();2122loop {23if stream.is_empty() {24break;25}26let value = parser(stream)?;27punctuated.push_value(value);28if stream.is_empty() {29break;30}31let punct = stream.parse()?;32punctuated.push_punct(punct);33}3435Ok(punctuated)36}37}383940