use super::{DisplayAttr, VariantAttr};
use syn::Ident;
use syn::parse::{Parse, ParseStream};
#[derive(Debug)]
pub enum NestedAttr {
Display(DisplayAttr),
Variant(VariantAttr),
}
impl NestedAttr {
pub fn parse_nested(meta: &syn::meta::ParseNestedMeta<'_>) -> syn::Result<Self> {
if meta.path.is_ident("display") {
let attr = DisplayAttr::parse_nested(meta)?;
return Ok(Self::Display(attr));
}
if meta.path.is_ident("variant") {
let attr = VariantAttr::parse_nested(meta)?;
return Ok(Self::Variant(attr));
}
Err(meta.error("unrecognized repr"))
}
}
impl Parse for NestedAttr {
fn parse(input: ParseStream) -> syn::Result<Self> {
let ident: Ident = input.parse()?;
if ident == "display" {
dbg!("found display attribute ");
let content;
syn::parenthesized!(content in input);
let format = if content.is_empty() {
None
} else {
Some(content.parse::<Ident>()?)
};
Ok(NestedAttr::Display(DisplayAttr { format }))
} else {
Err(syn::Error::new_spanned(ident, "unknown attribute"))
}
}
}