use crate::ast::{AliasSpec, AliasSpecItem};
use crate::parse::MIXING_SEP_ERROR;
use crate::util::unique_id::next_unique_id;
use std::rc::Rc;
use syn::parse::{Parse, ParseStream};
use syn::{Ident, Token};
impl Parse for AliasSpec {
fn parse(input: ParseStream) -> syn::Result<Self> {
let mut items = Vec::new();
let mut is_comma_used = None;
loop {
let spec_item: AliasSpecItem = input.parse()?;
items.push(spec_item);
if input.is_empty() {
break;
}
let is_comma_current_sep = if input.peek(Token![,]) {
input.parse::<Token![,]>()?;
true
} else if input.peek(Token![;]) {
input.parse::<Token![;]>()?;
false
} else {
return Err(input.error(r#"Expected "," or ";""#));
};
if let Some(is_comma_used) = is_comma_used {
if is_comma_used != is_comma_current_sep {
return Err(input.error(MIXING_SEP_ERROR));
}
} else {
is_comma_used = Some(is_comma_current_sep);
}
if !input.peek(Ident) {
break;
}
}
Ok(AliasSpec::new(
next_unique_id(),
items.into_iter().map(Rc::new).collect(),
is_comma_used,
))
}
}