2 个版本
0.1.1 | 2020 年 9 月 9 日 |
---|---|
0.1.0 | 2020 年 9 月 9 日 |
#16 在 #自动机
在 statemachine 中使用
29KB
515 行
statemachine-macro
一个 Rust 包,提供用于轻松创建状态机的宏。文档可在 docs.rs 上找到。
使用方法
将以下内容添加到您的 Cargo.toml
[dependencies]
statemachine-macro = "0.1"
入门指南
use statemachine_macro::*;
statemachine! {
struct Foo;
enum FooState consumes [char] from Start accepts [NonEmpty];
Start => {
char match _ => NonEmpty
},
NonEmpty => {
_ => NonEmpty
}
}
fn main() {
let mut foo: Foo = statemachine_new!(Foo{});
assert!(!foo.is_accepting());
foo.consume('a');
assert!(foo.is_accepting());
foo.consume('b');
assert!(foo.is_accepting());
foo.consume('c');
assert!(foo.is_accepting());
}
许可证
本包遵循 MIT 许可证条款发布。有关详细信息,请参阅 LICENSE 文件。
lib.rs
:
提供 statemachine!() 宏。
示例
use statemachine_macro::*;
statemachine! {
#[derive(Default)]
pub struct Foo {
pub allow_x: bool
}
enum FooState consumes [char, i32] from Start accepts [Done];
Start => {
@enter => {
println!("Entering Start!");
},
@leave => {
println!("Leaving Start!");
},
@loop => {
println!("Looping inside Start!");
},
char match 'a' => {
println!("Got 'a'... Going to 'Done'!");
Done
},
char match 'b' => {
println!("Got 'b'... allowing 'x'!");
self.allow_x = true;
Start
},
char match 'x' => if self.allow_x {
println!("Got authorized 'x'.");
Done
},
char match 'x' => if !self.allow_x {
println!("Got unauthorized 'x'.");
Error
},
i32 match 42 => {
println!("It is the answer!");
Error
},
i32 match val => {
println!("Got {}", val);
Error
},
_ => Error
},
Error => {
_ => Error
},
Done => {
_ => Error
}
}
let mut foo: Foo = Default::default();
foo.consume('a');
assert!(foo.is_accepting());
assert!(!foo.allow_x);
foo.reset(FooState::Start);
foo.consume('b');
assert!(!foo.is_accepting());
assert!(foo.allow_x);
foo.consume('x');
assert!(foo.is_accepting());
依赖项
~1.5MB
~35K SLoC