3个版本 (稳定)

1.0.2 2024年8月18日
0.1.0 2024年8月18日

#202过程宏

GPL-3.0 许可证

42KB
740

Mosaic

此crate提供了一个进程宏,用于将数据嵌入到你的Rust代码中。

示例

use mosaic::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

mosaic = "1"

背景

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

但是,由于paste crate已经不再定期更新,而我需要用于kebab case的大小写转换,我决定创建一个更强大和灵活的替代品。

结构

所有内容都通过embed宏传递,它是底层引擎的入口点。最初,仅将一个token树传递给一个任意的transformer链中的顶级转换器,然后通过token流进行计算。

块是embed宏的主要构建块,因为它们表示一个能够进行转换的token流

块由方括号定义,并带有< >的注释,因此,[< (..) >]表示一个块,其中(..)是目标token流。块也可以有自己的转换器链,该链紧随块之后。

块语法用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流 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 stream 转换为特定的大小写 kebabsnakecamelpascalupperlowertitle [< (hello[world]):case{pascal} >]
count 计算目标 token stream 中元素的数量 [< (hello[world]):count>]
append 将目标 token stream 与另一个 token stream 拼接 [< (hello[world]):append{[!]} >]
prefix 在目标 token stream 前添加另一个 token stream [< (hello[world]):prefix{[!]} >]

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

依赖项

~1.2–1.8MB
~33K SLoC