use derive_syn_parse::Parse;
use proc_macro2::Ident;
use syn::parse::{Parse, ParseStream, Result};
use syn::punctuated::Punctuated;
use syn::token::Bracket;
use syn::{bracketed, Attribute, Token};
#[derive(Parse)]
pub struct AllowedTypesMappings {
pub name: AllowedTypesName,
pub comma: Token![,],
pub types: AllowedTypesList,
pub trailing_comma: Option<Token![,]>,
}
#[derive(Parse)]
pub struct AllowedTypesName {
pub name: kw::name,
pub equals: Token![=],
pub ident: Ident,
}
pub struct AllowedTypesList {
pub types: kw::types,
pub equals: Token![=],
pub bracket: Bracket,
pub content: Punctuated<AllowedTypesMapping, Token![,]>,
}
impl Parse for AllowedTypesList {
fn parse(input: ParseStream) -> Result<Self> {
let content;
Ok(Self {
types: input.parse()?,
equals: input.parse()?,
bracket: bracketed!(content in input),
content: content.parse_terminated(AllowedTypesMapping::parse, Token![,])?,
})
}
}
pub struct AllowedTypesMapping {
pub attributes: Vec<Attribute>,
pub ty: Ident,
pub arrow: Token![=>],
pub ident: Ident,
}
impl Parse for AllowedTypesMapping {
fn parse(input: ParseStream) -> Result<Self> {
Ok(AllowedTypesMapping {
attributes: Attribute::parse_outer(input)?,
ty: input.parse()?,
arrow: input.parse()?,
ident: input.parse()?,
})
}
}
mod kw {
syn::custom_keyword!(types);
syn::custom_keyword!(name);
}