use syn::{Token, parse::Parse};
use crate::parse::next_node_id;
use crate::pattern::Pattern;
#[derive(Debug, Clone)]
pub(crate) struct PatternSet {
pub node_id: usize,
pub span: proc_macro2::Span,
pub elements: Vec<Pattern>,
pub rest: bool,
}
impl Parse for PatternSet {
fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> {
let hash_span = input.span();
let _: Token![#] = input.parse()?;
let content;
let paren = syn::parenthesized!(content in input);
let span = hash_span.join(paren.span.close()).unwrap_or(hash_span);
let mut elements = Vec::new();
let mut rest = false;
while !content.is_empty() {
if content.peek(Token![..]) {
let _: Token![..] = content.parse()?;
rest = true;
if content.peek(Token![,]) {
let _: Token![,] = content.parse()?;
}
break;
}
elements.push(content.parse()?);
if content.is_empty() {
break;
}
let _: Token![,] = content.parse()?;
if content.peek(Token![..]) {
let _: Token![..] = content.parse()?;
rest = true;
break;
}
}
Ok(PatternSet {
node_id: next_node_id(),
span,
elements,
rest,
})
}
}