pareg_core 0.13.0

This library contains the implementation for the pareg library.
Documentation
use proc_macro2::{TokenStream, TokenTree};
use syn::{
    Attribute, Meta, Token, parse::ParseStream, punctuated::Punctuated,
    spanned::Spanned,
};

use crate::proc::{Error, Result};

pub fn extract_attribute_list(
    attribute: Attribute,
) -> Result<Punctuated<TokenStream, Token![,]>> {
    match attribute.meta {
        Meta::List(l) => Ok(l.parse_args_with(punctuated_streams)?),
        Meta::Path(_) => Ok(Punctuated::default()),
        _ => {
            Error::msg_span(attribute.span(), "Invalid attribute style.").err()
        }
    }
}

pub fn punctuated_streams(
    input: ParseStream,
) -> syn::Result<Punctuated<TokenStream, Token![,]>> {
    let mut res = Punctuated::new();
    loop {
        let mut tokens = TokenStream::new();

        while !input.is_empty() && !input.peek(Token![,]) {
            tokens.extend([input.parse::<TokenTree>()?]);
        }

        if tokens.is_empty() && input.is_empty() {
            break;
        }

        res.push_value(tokens);

        let Ok(c) = input.parse() else {
            break;
        };
        res.push_punct(c);
    }

    Ok(res)
}