#proc-macro #state #compile-time #global #key-value #within #calls

macro_state

一套宏,允许在编译时和过程宏内部存储和加载全局状态

11个版本

0.2.0 2022年10月18日
0.1.9 2022年10月13日
0.1.5 2022年6月4日
0.1.2 2022年5月30日

#586过程宏

Download history 90/week @ 2024-03-14 59/week @ 2024-03-21 56/week @ 2024-03-28 55/week @ 2024-04-04 65/week @ 2024-04-11 80/week @ 2024-04-18 77/week @ 2024-04-25 59/week @ 2024-05-02 61/week @ 2024-05-09 72/week @ 2024-05-16 101/week @ 2024-05-23 53/week @ 2024-05-30 43/week @ 2024-06-06 46/week @ 2024-06-13 123/week @ 2024-06-20 210/week @ 2024-06-27

每月下载量 425
用于 可重用

MIT 协议

22KB
253

macro_state

crates.io GitHub Workflow Status (branch) docs.rs

目前,Rust没有提供在宏调用之间跟踪任何类型全局状态的能力。

这个crate包含一系列宏,使得在编译时和过程宏内部以字符串键值的形式保存和加载全局状态变得非常简单。如果需要,在编译时设置的状态也可以被运行时代码直接读取。

功能

write_state!append_state! 宏将状态存储在当前项目目标构建目录中的平面文件中。这确保了当您执行类似运行 cargo clean 或更改代码的操作时,当前状态值也会自动重置。换句话说,此crate会自动跟踪使用它的构建工件。

编译后,编译时存在的任何值都将嵌入到生成的二进制文件中。

目前,我们提供以下宏

  • write_state!("key","value")"value" 作为键 "key" 的值写入
  • read_state!("key") 返回键 "key" 的值,如果找不到则引发编译器错误
  • init_state!("key","value") 如果键 "key" 有值,则返回它;否则将其设置为 "value" 并返回它。这可以用来快速初始化可能已有数据的键值对
  • has_state!("key") 返回一个布尔值,表示是否为键 "key" 存储了值
  • clear_state!("key") 如果存在,则清除键 "key" 的任何现有状态值
  • append_state!("key","value")"value" 追加到指定键的值列表中。与 read_state_vec! 结合使用,用于在状态文件中添加和管理列表。
  • read_state_vec!("key") 将键 "key" 的状态文件读取为 Vec<String>。与 append_state! 结合使用,用于管理状态文件中的列表。

在Proc宏中

上述所有宏的非宏类似物可以在 这里 找到。这些类似物都以 proc_ 开头,例如 proc_read_state,并且 应在宏内部使用

在这些函数不在宏内部使用的情况下会导致损坏/未定义的行为。

安装

首先,将 macro_state 作为依赖项添加到您的 Cargo.toml 文件中

[dependencies]
macro_state = "0.1.9"

接下来设置您的导入

extern crate macro_state;
use macro_state::*;

用法

现在您可以在您的crate的任何地方调用 write_state!read_state!,包括在proc宏内部!

write_state!("top of module", "value 1");

#[test]
fn test_write_state() {
    write_state!("top of method", "value 2");
    assert_eq!(read_state!("top of module"), "value 1");
    assert_eq!(read_state!("top of method"), "value 2");
}

在调用 write_state 之后,例如 write_state!("my key", "my value");,您写入的状态现在可以在指定的键中使用,以便在源代码中更下面的 read_state!("my key"); 调用中。请注意,所有这些都是在编译时发生的,所以请确保您的源代码和宏调用以正确的方式排列,以便您的 write_state 调用会在 read_state 调用之前编译。

依赖项

~1.5MB
~36K SLoC