16个版本
0.10.3 | 2023年11月26日 |
---|---|
0.10.2 | 2022年3月22日 |
0.10.1 | 2020年7月14日 |
0.9.0 | 2019年9月3日 |
0.8.4 | 2018年5月18日 |
#193 in 算法
用于 apis
100KB
2.5K SLoC
macro-machines
具有日志记录和Graphviz dotfile生成的状态机宏
当前功能
- 创建具有或没有
Debug
和Default
的宏的状态机def_machine!
-- 实现Default
构建的状态机def_machine_debug!
-- 实现Default
构建并派生Debug
的状态机def_machine_nodefault!
-- 需要初始化参数的状态机def_machine_nodefault_debug!
-- 需要初始化参数并派生Debug
的状态机
- 指定初始(必需)和终止(可选)状态,以及(可选)初始化和终止动作
- 状态可以具有局部状态变量,状态机可以具有扩展状态变量
- 具有可选关联参数和动作的事件,其中扩展状态变量可以被修改
- 外部事件 -- 从特定源状态到特定目标状态的转换
- 内部事件 -- 允许修改局部状态变量且不改变当前状态的事件
- 通用事件 -- 从任何源状态到特定目标状态的转换
- 语法允许在扩展状态变量的类型中使用约束类型参数
- 使用
log
日志API进行日志记录 - 生成状态机转换图Graphviz DOT文件
当前限制
- 当前仅记录跟踪级别的消息
使用方法
定义和使用最小状态机
use macro_machines::def_machine_debug;
def_machine_debug!{
machine M {
STATES [
state S ()
state T ()
]
EVENTS [
event A <S> => <T> ()
]
EXTENDED []
initial_state: S
}
}
fn main () {
use macro_machines::HandleEventException;
let mut m = M::initial();
m.handle_event (EventId::A.into()).unwrap();
assert_eq!(m.handle_event (EventId::A.into()), Err (HandleEventException::WrongState));
}
生成dot文件并写入文件
use std::io::Write;
use macro_machines::MachineDotfile;
let mut f = std::fs::File::create ("minimal.dot").unwrap();
f.write_all (M::dotfile().as_bytes()).unwrap();
drop (f);
使用$ dot -Tpng minimal.dot > minimal.png
渲染为PNG
更复杂状态机的示例,请参阅./examples/
目录。
依赖项
依赖项
~2MB
~38K SLoC