2 个版本

0.1.1 2024 年 8 月 18 日
0.1.0 2024 年 8 月 18 日

#492Rust 模式

GPL-3.0 许可证

9KB
76

Permafrost

该包提供了一个用于将数据嵌入 Rust 代码的进程宏。

示例

use permafrost::embed;

/// Expands to a const item that contains a greeting.
macro_rules! greet {
    (
        $who:literal
    ) => {
        embed! {
            #[allow(dead_code)]
            const [< HELLO _ $who:case{upper} >]:concatenate : &str = [< "Hello" " " $who "!" >]:concatenate{string};
        }
    }
}

greet!("Jonas");
// Recursive expansion of greet! macro
// ====================================

const HELLO_JONAS: &str = r#"Hello Jonas!"#;

用法

将以下内容添加到您的 Cargo.toml

permafrost = "1"

背景

最初,这是作为 paste 包的替代品开始的,该包允许您连接标识符并对它们应用大小写转换。

但是,鉴于 paste 包不再定期更新,而且我需要用于 kebab 案的大小写转换,我决定创建一个更强大、更灵活的替代方案。

结构

所有内容都传递给 embed 宏,它是底层引擎的入口点。最初,只传递一个 token tree 作为任意 transformer chain 中的顶层转换器,然后通过 token stream 进行纯计算。

块是 embed 宏的主要构建块,因为它们表示一个具有转换能力的 token stream

块由方括号定义,并用 < > 标注,因此,[< (..) >] 表示一个块,其中 (..) 是目标 token stream。块也可以有自己的转换器链,它将跟随块。

块语法以 EBNF 给出

token-stream = token-tree | segment;

token-tree = group | ident | literal | punct | ...;

segment = block transformer-chain;

transformer = ident | ident "{" token-stream "}";

transformer-chain = ":" transformer { "," transformer };

block = "[" "<" token-stream { token-stream } ">" "]" [ transformer-chain ];

转换器

所有当前可用的转换器如下

转换器 描述 参数 示例
concatenate 连接目标 token stream identstringr#ident [< (hello[world]):concatenate{ident} >]
ungroup 取消分组目标 token stream [< (hello[world]):ungroup>]
flatten 展平目标 token stream [< (hello[world]):flatten>]
reverse 反转目标 token stream [< (hello[world]):reverse>]
stringify 将目标 token stream 字面化 [< (hello[world]):stringify>]
unstringify 取消字面化目标 token stream [< "hello world":unstringify>]
case 将目标 token流 转换为特定的大小写 kebabsnakecamelpascalupperlowertitle [< (hello[world]):case{pascal} >]
计数 计算目标 token流 中元素的数量 [< (hello[world]):计数>]
附加 将目标 token流 与另一个 token流 附加在一起 [< (hello[world]):附加{[!]} >]
前缀 将另一个 token流 作为前缀附加到目标 token流 [< (hello[world]):前缀{[!]} >]

如果您认为缺少一个基本转换器,请提交一个issue。

依赖项

~1.2–1.8MB
~33K SLoC