#状态机 #状态转换 # #日志记录 #事件 #生成 #默认

macro-machines

具有日志记录和Graphviz DOT文件生成的状态机宏

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

MPL-2.0 许可证

100KB
2.5K SLoC

macro-machines

具有日志记录和Graphviz dotfile生成的状态机宏

文档

当前功能

  • 创建具有或没有DebugDefault的宏的状态机
    • 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