use core::iter::Peekable;
use alloc::string::ToString;
use proc_macro::{Delimiter, TokenTree, TokenStream};
fn parse_simple_path_in_vis(iter: &mut Peekable<impl Iterator<Item = TokenTree>>) {
let _path = crate::simple_path::parse_simple_path(iter);
}
pub fn parse_optional_visibility(
iter: &mut Peekable<impl Iterator<Item = TokenTree>>,
) -> TokenStream {
let mut vis = {
if !matches!(iter.peek(), Some(TokenTree::Ident(ident)) if ident.to_string() == "pub") {
return TokenStream::new();
}
let r#pub = iter.next().expect("peeked visibility declaration couldn't be consumed");
TokenStream::from_iter([r#pub])
};
const PARENS: Delimiter = Delimiter::Parenthesis;
if !matches!(iter.peek(), Some(TokenTree::Group(group)) if group.delimiter() == PARENS) {
return vis;
}
let Some(TokenTree::Group(scope)) = iter.next() else {
panic!("peeked visibility scope couldn't be consumed")
};
{
let mut iter = scope.stream().into_iter().peekable();
match iter.next().expect("scope had parentheses yet no parameter") {
TokenTree::Ident(ident) => match ident.to_string().as_str() {
"crate" | "self" | "super" => {}
"in" => parse_simple_path_in_vis(&mut iter),
_ => panic!("unrecognized parameter for scope specification"),
},
_ => panic!("scope specification didn't start with an ident"),
}
assert!(iter.next().is_none(), "scope had unexpected trailing elements");
}
vis.extend([TokenTree::Group(scope)]);
vis
}