Reject multiple variants marked as other, error message improvements

rename
Pantonshire 5 years ago
parent c7cc6507ad
commit 13be79f632

@ -48,6 +48,7 @@ fn parse_enum(data: DataEnum) -> MacroResult<Enum> {
let mut variants = Vec::with_capacity(data.variants.len()); let mut variants = Vec::with_capacity(data.variants.len());
let mut taken_names = HashSet::new(); let mut taken_names = HashSet::new();
let mut other_variant = false;
for variant in data.variants { for variant in data.variants {
let variant_ident = variant.ident.to_string(); let variant_ident = variant.ident.to_string();
@ -76,6 +77,18 @@ fn parse_enum(data: DataEnum) -> MacroResult<Enum> {
span: variant_span, span: variant_span,
} }
} else if other { } else if other {
if other_variant {
return Err(MacroError::new(
format!(
"cannot have multiple variants marked as {}",
OTHER
),
variant_span,
));
}
other_variant = true;
if let Some((_, name_span)) = name_opt { if let Some((_, name_span)) = name_opt {
return Err(MacroError::new( return Err(MacroError::new(
format!( format!(
@ -120,8 +133,10 @@ fn parse_enum(data: DataEnum) -> MacroResult<Enum> {
if variant.fields.len() != 0 { if variant.fields.len() != 0 {
return Err(MacroError::new( return Err(MacroError::new(
format!( format!(
"the variant {} must not have any fields", "the variant {} must not have any fields\n\
variant_ident hint: if you do not want to remove {}\'s fields, try using \
#[enumscribe(ignore)] for {}",
variant_ident, variant_ident, variant_ident
), ),
variant_span, variant_span,
)); ));

Loading…
Cancel
Save