bevyengine/bevy · error · syn::Error

EntityEvent derive expected a field name 'entity' or a field

Error message

EntityEvent derive expected a field name 'entity' or a field annotated with #[event_target].

What it means

Compile error from get_event_target_field: the struct has named fields but none is named `entity` and none carries #[event_target], so find_map returned None and ok_or raised this sentinel. The field selection heuristic (name match or attribute) found no candidate.

Source

Thrown at crates/bevy_ecs/macros/src/event.rs:185

/// or the field with the name "entity".
fn get_event_target_field(ast: &DeriveInput) -> Result<Member> {
    let Data::Struct(DataStruct { fields, .. }) = &ast.data else {
        return Err(syn::Error::new(
            ast.span(),
            "EntityEvent can only be derived for structs.",
        ));
    };
    match fields {
        Fields::Named(fields) => fields.named.iter().find_map(|field| {
            if field.ident.as_ref().is_some_and(|i| i == "entity") || field
                .attrs
                .iter()
                .any(|attr| attr.path().is_ident(EVENT_TARGET)) {
                    Some(Member::Named(field.ident.clone()?))
                } else {
                    None
                }
        }).ok_or(syn::Error::new(
            fields.span(),
            "EntityEvent derive expected a field name 'entity' or a field annotated with #[event_target]."
        )),
        Fields::Unnamed(fields) if fields.unnamed.len() == 1 => Ok(Member::Unnamed(Index::from(0))),
        Fields::Unnamed(fields) => fields.unnamed.iter().enumerate().find_map(|(index, field)| {
                if field
                    .attrs
                    .iter()
                    .any(|attr| attr.path().is_ident(EVENT_TARGET)) {
                        Some(Member::Unnamed(Index::from(index)))
                    } else {
                        None
                    }
            })
            .ok_or(syn::Error::new(
                fields.span(),
                "EntityEvent derive expected unnamed structs with one field or with a field annotated with #[event_target].",
            )),

View on GitHub (pinned to 396ca72708)

Solutions

  1. Rename a field to `entity`: struct E { entity: Entity, .. }
  2. Annotate the target field explicitly: #[event_target] pub target: Entity
  3. Restructure as a single-field tuple struct: struct E(Entity);
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at crates/bevy_ecs/macros/src/event.rs:185 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/1ede2add951304b5. Report an issue: GitHub.