#bevy-plugin #generator #config #hierarchical #enums #comments #structs-enums

nightly bevy_state_plugin_generator

A build-dependency that generates a Bevy State Plugin from a simple state definition

16 releases (9 stable)

Uses new Rust 2024

1.2.3 Feb 21, 2025
1.2.2 Feb 18, 2025

#421 in Algorithms

Download history 412/week @ 2025-02-08 486/week @ 2025-02-15 122/week @ 2025-02-22 21/week @ 2025-03-01

673 downloads per month

MIT license

63KB
1.5K SLoC

State-Plugin generator

Generates a bunch of hierarchical states (structs and enums, using State and SubState) and sets up their relationships in a Plugin.

versions

bevy this thing
0.15.2 1.2.0

bugs

// TODO: fix naming-scheme collision detection
// TODO: allow customizing derived traits
// TODO: allow specifying naming-scheme in states.txt per-node

usage

Create a states.txt in src/:

// the root is implicit
Loading // comments go until the end of the line
Ready { Menu Game }                     // enum state
Exiting                                 // singleton
# // this is just here to check the above example
# use bevy_state_plugin_generator::config_is_valid;
# assert!(config_is_valid("Read { Config Assets }"));
# #[cfg(feature = "lists")]
# assert!(config_is_valid("Loading [ Config Assets ]"));
# #[cfg(feature = "comments")]
# assert!(config_is_valid("Loading // Comments"));

Set up your build.rs like this:

use bevy_state_plugin_generator::*;
fn main() {
  /// The [Default::default] configuration is:
  let config = PluginConfig {
    plugin_name: "GeneratedStatesPlugin",
    state_name: "GameState",
    states_module_name: "states",
    scheme: NamingScheme::Full,
    additional_derives: &[],
  };
  on_build_generate_plugin("src/states.txt", "src/generated_states.rs", config)
    .expect("Failed to generate plugin!");
}

And it will generate something like the following:

use bevy::prelude::{App, AppExtStates};
pub mod states {
    use bevy::prelude::{States, SubStates, StateSet};
    #[derive(States, Hash, Default, Debug, Clone, PartialEq, Eq)]
    pub enum GameState { #[default] Loading, Ready, Exiting }
    #[derive(SubStates, Hash, Default, Debug, Clone, PartialEq, Eq)]
    #[source(GameState = GameState::Loading)]
    pub struct GameStateLoading;
    #[derive(SubStates, Hash, Default, Debug, Clone, PartialEq, Eq)]
    #[source(GameStateLoading = GameStateLoading)]
    pub struct GameStateLoadingConfigs;
    #[derive(SubStates, Hash, Default, Debug, Clone, PartialEq, Eq)]
    #[source(GameStateLoading = GameStateLoading)]
    pub struct GameStateLoadingAssets;
    #[derive(SubStates, Hash, Default, Debug, Clone, PartialEq, Eq)]
    #[source(GameState = GameState::Ready)]
    pub enum GameStateReady { #[default] Menu, Game }
}
pub struct GeneratedStatesPlugin;
impl bevy::app::Plugin for GeneratedStatesPlugin {
    fn build(&self, app: &mut App) {
        app.init_state::<states::GameState>();
    }
}

Dependencies

~1.5–8.5MB
~75K SLoC