bevyengine/bevy · error · syn::Error
SettingsGroup cannot be derived for unions
Error message
SettingsGroup cannot be derived for unions
What it means
Compile error from derive_settings_group: the DeriveInput's data is a DataUnion. SettingsGroup codegen only handles structs (named, unnamed, or unit), so the match on input.data has no productive arm for unions and raises this shape guard.
Source
Thrown at crates/bevy_ecs/macros/src/lib.rs:721
let key_name = match &input.data {
Data::Struct(data) => match data.fields {
Fields::Named(_) if override_key_name.is_some() => {
return syn::Error::new(
Span::call_site(),
"The `key` attribute is not supported for structs with named fields",
)
.into_compile_error()
.into();
}
Fields::Named(_) => None,
Fields::Unnamed(_) | Fields::Unit => {
override_key_name.or_else(|| Some(pascal_to_snake_case(&name.to_string())))
}
},
Data::Enum(_) => override_key_name.or(Some(pascal_to_snake_case(&name.to_string()))),
Data::Union(_) => {
return syn::Error::new(
Span::call_site(),
"SettingsGroup cannot be derived for unions",
)
.into_compile_error()
.into();
}
};
let group_name = override_group_name.unwrap_or(pascal_to_snake_case(&name.to_string()));
let key_name = key_name
.map(|f| quote! { #FQOption::Some(#f) })
.unwrap_or(quote! { #FQOption::None });
let file_name = override_file
.map(|f| quote! { #FQOption::Some(#f) })
.unwrap_or(quote! { #FQOption::None });
let expanded = quote! {
impl #path::SettingsGroup for #name {View on GitHub (pinned to 396ca72708)
Solutions
- Change the union into a struct; unions cannot represent a settings hierarchy
- Model the variants as separate settings-group structs and select at runtime
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at crates/bevy_ecs/macros/src/lib.rs:721 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of bevyengine/bevy@396ca72708 (2026-08-20).
Data as JSON: /api/errors/68952769b58455f7.
Report an issue: GitHub.