use crate::ast::{Enum, Field, Input, Struct, Variant};
use syn::{Error, Result};
impl Input<'_> {
pub(crate) fn validate(&self) -> Result<()> {
match self {
Input::Struct(input) => input.validate(),
Input::Enum(input) => input.validate(),
}
}
}
impl Struct<'_> {
fn validate(&self) -> Result<()> {
for field in &self.fields {
field.validate()?;
}
Ok(())
}
}
impl Enum<'_> {
fn validate(&self) -> Result<()> {
let has_display = self.has_display();
for variant in &self.variants {
variant.validate()?;
if has_display && variant.attrs.display.is_none() {
return Err(Error::new_spanned(
variant.original,
"missing #[display(\"...\")] display attribute",
));
}
}
Ok(())
}
}
impl Variant<'_> {
fn validate(&self) -> Result<()> {
for field in &self.fields {
field.validate()?;
}
Ok(())
}
}
impl Field<'_> {
fn validate(&self) -> Result<()> {
if let Some(display) = &self.attrs.display {
return Err(Error::new_spanned(
display.original,
"not expected here; the #[display(...)] attribute belongs on top of a struct or an enum variant",
));
}
Ok(())
}
}