diff --git a/crates/bevy_ecs/macros/src/states.rs b/crates/bevy_ecs/macros/src/states.rs index b80a5b6ff1..0eb516c315 100644 --- a/crates/bevy_ecs/macros/src/states.rs +++ b/crates/bevy_ecs/macros/src/states.rs @@ -1,26 +1,11 @@ -use proc_macro::{Span, TokenStream}; +use proc_macro::TokenStream; use quote::{format_ident, quote}; -use syn::{parse_macro_input, Data::Enum, DeriveInput}; +use syn::{parse_macro_input, DeriveInput}; use crate::bevy_ecs_path; pub fn derive_states(input: TokenStream) -> TokenStream { let ast = parse_macro_input!(input as DeriveInput); - let error = || { - syn::Error::new( - Span::call_site().into(), - "derive(States) only supports fieldless enums", - ) - .into_compile_error() - .into() - }; - let Enum(enumeration) = ast.data else { - return error(); - }; - if enumeration.variants.iter().any(|v| !v.fields.is_empty()) { - return error(); - } - let generics = ast.generics; let (impl_generics, ty_generics, where_clause) = generics.split_for_impl(); @@ -28,17 +13,9 @@ pub fn derive_states(input: TokenStream) -> TokenStream { trait_path.segments.push(format_ident!("schedule").into()); trait_path.segments.push(format_ident!("States").into()); let struct_name = &ast.ident; - let idents = enumeration.variants.iter().map(|v| &v.ident); - let len = idents.len(); quote! { - impl #impl_generics #trait_path for #struct_name #ty_generics #where_clause { - type Iter = std::array::IntoIter; - - fn variants() -> Self::Iter { - [#(Self::#idents,)*].into_iter() - } - } + impl #impl_generics #trait_path for #struct_name #ty_generics #where_clause {} } .into() } diff --git a/crates/bevy_ecs/src/schedule/condition.rs b/crates/bevy_ecs/src/schedule/condition.rs index 819dfe448f..92bd416300 100644 --- a/crates/bevy_ecs/src/schedule/condition.rs +++ b/crates/bevy_ecs/src/schedule/condition.rs @@ -1190,7 +1190,7 @@ mod tests { .distributive_run_if(resource_changed_or_removed::>()) .distributive_run_if(resource_removed::>()) .distributive_run_if(state_exists::()) - .distributive_run_if(in_state(TestState::A)) + .distributive_run_if(in_state(TestState::A).or_else(in_state(TestState::B))) .distributive_run_if(state_changed::()) .distributive_run_if(on_event::()) .distributive_run_if(any_with_component::()) diff --git a/crates/bevy_ecs/src/schedule/state.rs b/crates/bevy_ecs/src/schedule/state.rs index a60bffdb82..a39f8cc036 100644 --- a/crates/bevy_ecs/src/schedule/state.rs +++ b/crates/bevy_ecs/src/schedule/state.rs @@ -40,13 +40,7 @@ pub use bevy_ecs_macros::States; /// } /// /// ``` -pub trait States: 'static + Send + Sync + Clone + PartialEq + Eq + Hash + Debug + Default { - /// The type returned when iterating over all [`variants`](States::variants) of this type. - type Iter: Iterator; - - /// Returns an iterator over all the state variants. - fn variants() -> Self::Iter; -} +pub trait States: 'static + Send + Sync + Clone + PartialEq + Eq + Hash + Debug + Default {} /// The label of a [`Schedule`](super::Schedule) that runs whenever [`State`] /// enters this state.