bevy_state_plugin_generator 1.4.4

A build-dependency that generates a Bevy State Plugin from a simple state definition.
Documentation
pub use insta::*;
pub use rstest::*;
pub use speculoos::prelude::*;

pub use crate::set_snapshot_suffix;

#[macro_export]
#[allow(missing_docs)]
macro_rules! set_snapshot_suffix {
    ($($expr:expr),*) => {
        let mut settings = insta::Settings::clone_current();
        settings.set_snapshot_suffix(format!($($expr,)*));
        let _guard = settings.bind_to_scope();
    }
}

pub mod node_data {
    use bevy_utils::default;

    use super::*;
    use crate::processing::NodeData;

    fn node<S: ToString>(name: S, index: usize, depth: usize, parent: Option<usize>) -> NodeData {
        let name = name.to_string();
        NodeData {
            index,
            parent,
            resolved_name: Some(name.clone()),
            name,
            depth,
            ..default()
        }
    }

    #[fixture]
    pub fn single_node() -> Vec<NodeData> {
        vec![node("RootState", 0, 0, None)]
    }

    #[fixture]
    pub fn nested_example() -> Vec<NodeData> {
        vec![
            node("RootState", 0, 0, None),
            node("Menu", 1, 1, Some(0)),
            node("Options", 2, 2, Some(1)),
            node("Audio", 3, 3, Some(2)),
            node("Video", 4, 3, Some(2)),
        ]
    }
}

pub mod node {
    use super::*;
    use crate::parsing::Node;

    #[fixture]
    pub fn duplicate_names() -> Node<'static> {
        Node::list("Root", [Node::singleton("A"), Node::singleton("A")])
    }

    #[fixture]
    pub fn overlapping_names() -> Node<'static> {
        Node::list(
            "Root",
            [
                Node::enumeration("Root", [Node::singleton("A")]),
                Node::singleton("A"),
            ],
        )
    }

    #[fixture]
    pub fn enum_root_a() -> Node<'static> {
        Node::enumeration("Root", [Node::singleton("A")])
    }

    #[fixture]
    pub fn enum_root_ab() -> Node<'static> {
        Node::enumeration("Root", [Node::singleton("A"), Node::singleton("B")])
    }

    #[fixture]
    pub fn enum_root_a_b() -> Node<'static> {
        Node::enumeration("Root", [Node::enumeration("A", [Node::singleton("B")])])
    }

    #[fixture]
    pub fn enum_root_a_b_up_c() -> Node<'static> {
        Node::enumeration(
            "Root",
            [
                Node::enumeration("A", [Node::singleton("B")]),
                Node::singleton("C"),
            ],
        )
    }

    #[fixture]
    pub fn list_root_a() -> Node<'static> {
        Node::list("Root", [Node::singleton("A")])
    }

    #[fixture]
    pub fn list_root_ab() -> Node<'static> {
        Node::list("Root", [Node::singleton("A"), Node::singleton("B")])
    }

    #[fixture]
    pub fn list_root_a_b() -> Node<'static> {
        Node::list("Root", [Node::list("A", [Node::singleton("B")])])
    }

    #[fixture]
    pub fn list_root_a_b_up_c() -> Node<'static> {
        Node::list(
            "Root",
            [
                Node::list("A", [Node::singleton("B")]),
                Node::singleton("C"),
            ],
        )
    }

    #[fixture]
    pub fn nested_example() -> Node<'static> {
        Node::enumeration(
            "Menu",
            [
                Node::singleton("Main"),
                Node::comment("these are the options"),
                Node::enumeration(
                    "Options",
                    [
                        Node::singleton("Graphics"),
                        Node::singleton("Audio"),
                        Node::singleton("Gameplay"),
                    ],
                ),
                Node::enumeration("Game", [Node::singleton("Save"), Node::singleton("Load")]),
            ],
        )
    }
}