Function timrs_macro_utils::parse::accumulate_while

source ·
pub fn accumulate_while<F>(
    cursor: Cursor<'_>,
    predicate: F
) -> Result<(TokenStream, Cursor<'_>)>
where F: FnMut(Cursor<'_>) -> bool,
Expand description

Accumulate proc_macro2::TokenTree into a proc_macro2::TokenStream while the given predicate returns true returning a tuple containing the resulting proc_macro2::TokenStream and a syn::buffer::Cursor positioned at the point where accumulation ended.

§Examples

use core::str::FromStr;
use proc_macro2::TokenStream;
use syn::{
    parse::{Parse, ParseStream},
    parse2, Result as SynResult,
};
use timrs_macro_utils::parse::accumulate_while;

#[derive(Debug, PartialEq)]
struct Test { value: String }

impl Parse for Test {
    fn parse(input: ParseStream) -> SynResult<Self> {
        SynResult::Ok(Self {
            value: input
                .step(|cursor| accumulate_while(*cursor, |current| !current.eof()))?
                .to_string(),
        })
    }
}

assert_eq!(
    parse2::<Test>(
        TokenStream::from_str("ARBITRARY_TOKEN").map_err(|error| error.to_string()).unwrap()
    ).map_err(|error| error.to_string()).unwrap(),
    Test { value: "ARBITRARY_TOKEN".to_owned() }
);

§Errors

Returns the syn::Error if the cursor hits eof before the predicate returns false.