2 个不稳定版本

0.2.0 2021 年 2 月 7 日
0.1.0 2021 年 1 月 30 日

#1001 in 数据结构

MIT 许可证

26KB
341

Workflow Status

statemachine-rs

一个零依赖项的库,用于实现状态机。

用法

让我们看看以下简单的例子。此示例显示状态机可以从给定的字符串(在此机中称为 current_state)转换其数字,然后产生输出。

use statemachine_rs::machine::{builder::StateMachineBuilder, StateMachine};

fn main() {
    let sm = StateMachineBuilder::start()
        .initial_state(1)
        .transition(|state, input| match (state, input) {
            (1, "next") => 2,
            (2, "next") => 3,
            _ => unreachable!(),
        })
        .build()
        .unwrap();

    assert_eq!(1, sm.current_state());
    sm.consume("next");
    assert_eq!(2, sm.current_state());
}

您可以使用 statemachine_rs::machine::builder::StateMachineBuilder 来组装您的状态机。 StateMachineBuilder::initial_state() 初始化其机器的初始状态。 StateMachineBuilder::transition() 定义转换模型。

当然,我们可以使用 enum 来表示状态和输入。让我们看看另一个例子。

以下示例说明,如果您按下按钮,状态将变为 On。否则,Off

use statemachine_rs::machine::{builder::StateMachineBuilder, StateMachine};

#[derive(Clone, Debug, PartialEq)]
enum ButtonState {
    On,
    Off,
}

enum Input {
    Press,
}

fn main() {
    let sm = StateMachineBuilder::start()
        .initial_state(ButtonState::Off)
        .transition(|state, input| match (state, input) {
            (ButtonState::On, Input::Press) => ButtonState::Off,
            (ButtonState::Off, Input::Press) => ButtonState::On,
        })
        .build()
        .unwrap();

    assert_eq!(ButtonState::Off, sm.current_state());
    sm.consume(Input::Press);
    assert_eq!(ButtonState::On, sm.current_state());
}

许可证

MIT

贡献

欢迎所有贡献。

如果您有改进此库的想法,请创建新的问题或提交新的拉取请求。

许可证:MIT

无运行时依赖