3个版本 (稳定)
新 1.0.2 | 2024年8月18日 |
---|---|
0.1.0 | 2024年8月18日 |
#202 在 过程宏
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流 |
ident ,string ,r#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 转换为特定的大小写 |
kebab ,snake ,camel ,pascal ,upper ,lower ,title |
[< (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