use super::{comma_seped_parser::CommaSepedParser, error::anon_selector_impl::Error, Parse};
use crate::sel_queries::{AnonSelQuery, RetTyKind, SelQueryKind, SelSyntax};
use proc_macro::{token_stream::IntoIter as TokenTreeIter, Delimiter, TokenTree};
impl Parse for AnonSelQuery {
type Error = Error;
type OkTy = Self;
type Wrapper<T, E> = Result<T, E>;
fn parse(iter: &mut TokenTreeIter) -> Self::Wrapper<Self::OkTy, Self::Error> {
let Some(ident) = iter.next() else { return Err(Error::Finished) };
let kind = match ident.to_string().as_str() {
"Single" => SelQueryKind::Single,
"Multi" => SelQueryKind::Multi,
_ => return Err(Error::UnknownSelectorKind),
};
let Some(paren_group) = iter.next() else { return Err(Error::ParenExpected) };
let TokenTree::Group(paren_group) = paren_group else { return Err(Error::ParenExpected) };
if !(matches!(paren_group.delimiter(), Delimiter::Parenthesis)) {
return Err(Error::ParenExpected);
};
let mut paren_group_contents_iter = paren_group.stream().into_iter();
let Some(str_lit) = paren_group_contents_iter.next() else {
panic!("Expected a string literal");
};
let TokenTree::Literal(str_lit) = str_lit else {
panic!("Expected a string literal");
};
let quoteless = str_lit
.to_string()
.strip_prefix("\"")
.expect("Expected a string literal")
.strip_suffix("\"")
.expect("Expected a string literal")
.to_owned();
let Some(syn) = SelSyntax::new(quoteless) else {
return Err(Error::InvalidSelectorSyntax);
};
let ret_ty = CommaSepedParser::<RetTyKind>::parse(&mut paren_group_contents_iter)
.unwrap_or(Ok(RetTyKind::T))
.expect("Unknown return type kind");
Ok(Self { kind, syn, ret_ty })
}
}