brisk-machine 0.2.0

Use of the brisk declarative engine to generate state machines.
Documentation
// #![deny(warnings)]

#[derive(Default)]
struct GameViewProperties {
    label_visible: bool,
}

impl GameViewProperties {
    fn do_something(&self) {}
}

impl From<&MachineProperties> for GameViewProperties {
    fn from(_: &MachineProperties) -> Self {
        Self {
            label_visible: false,
        }
    }
}

struct MachineProperties {}

impl MachineProperties {
    fn do_something(&self) {}
}

#[derive(Default)]
struct SeventhProperties {}

#[derive(Default)]
struct EigthProperties {}

brisk_machine::brisk_it! {
  Machine
  {
    id: Main,
    properties: MachineProperties,
    State {
      id: MainMenuView,
      State {
        id: MainMenu,
      },
      State {
        id: LoadMenu,
      },
      State {
        id: SettingsMenu,
      },
      on load_clicked: MainMenu => LoadMenu {  },
      on settings_clicked: MainMenu => SettingsMenu { },
      on back_clicked: [ LoadMenu => MainMenu { }, SettingsMenu => MainMenu { } ]
    },
    State {
      id: LoadingView,
    },
    State
    {
      id: GameView,
      properties: GameViewProperties,
      Group
      {
        id: FirstGroup,
        State { id: First },
        State { id: Second },
        on f2s: First => Second { }
      },
      Group
      {
        id: SecondGroup,
        State { id: Third },
        State { id: Fourth },
        on f2s: Third => Fourth { super_properties.do_something() }
      },
      Group
      {
        id: ThirdGroup,
        State {
          id: Fifth,
          State
          {
            id: Seventh,
            properties: SeventhProperties,
          },
          State
          {
            id: Eigth,
            properties: EigthProperties,
          },
          on s2e: Seventh => Eigth {  },
        },
        State {
          id: Sixth,
        },
        on game_ready: Fifth => Sixth {  },
      }
    },
    on new_game_clicked: MainMenuView => LoadingView { super_properties.do_something() },
    on game_ready: LoadingView => GameView {  },
  }
}

#[test]
fn test_main() {
    let m = std::cell::RefCell::new(MainMachine::create(MachineProperties {}));
    assert!(match &*m.borrow().state.borrow() {
        Main::MainMenuView { state } => match state {
            MainMenuView::MainMenu => true,
            _ => false,
        },
        _ => false,
    });
    // MainMenu => LoadMenu
    let ec = MainMachine::start_events(&m);
    ec.load_clicked();
    drop(ec);
    assert!(match &*m.borrow().state.borrow() {
        Main::MainMenuView { state } => match state {
            MainMenuView::LoadMenu => true,
            _ => false,
        },
        _ => false,
    });
    // LoadMenu => LoadMenu
    let ec = MainMachine::start_events(&m);
    ec.settings_clicked();
    drop(ec);
    assert!(match &*m.borrow().state.borrow() {
        Main::MainMenuView { state } => match state {
            MainMenuView::LoadMenu => true,
            _ => false,
        },
        _ => false,
    });

    // LoadMenu => MainMenu
    let ec = MainMachine::start_events(&m);
    ec.back_clicked();
    drop(ec);
    assert!(match &*m.borrow().state.borrow() {
        Main::MainMenuView { state } => match state {
            MainMenuView::MainMenu => true,
            _ => false,
        },
        _ => false,
    });
    // LoadMenu => SettingsMenu
    let ec = MainMachine::start_events(&m);
    ec.settings_clicked();
    drop(ec);
    assert!(match &*m.borrow().state.borrow() {
        Main::MainMenuView { state } => match state {
            MainMenuView::SettingsMenu => true,
            _ => false,
        },
        _ => false,
    });

    // SettingsMenu => MainMenu
    let ec = MainMachine::start_events(&m);
    ec.back_clicked();
    drop(ec);
    assert!(match &*m.borrow().state.borrow() {
        Main::MainMenuView { state } => match state {
            MainMenuView::MainMenu => true,
            _ => false,
        },
        _ => false,
    });
    // MainMenu => GameView
    let ec = MainMachine::start_events(&m);
    ec.new_game_clicked();
    ec.game_ready();
    drop(ec);
    assert!(match &*m.borrow().state.borrow() {
        Main::GameView { .. } => true,
        _ => false,
    },);
}