#import #template #generation #code-generation #white-space #language #proc-macro

genco

一个具有空格感知的近似引用,用于生成美观的代码

105 个发布版本

0.17.9 2024年5月18日
0.17.8 2023年11月7日
0.17.7 2023年10月9日
0.17.5 2023年3月22日
0.1.11 2017年11月22日

#17模板引擎 中排名

Download history 10056/week @ 2024-05-04 6122/week @ 2024-05-11 8169/week @ 2024-05-18 7346/week @ 2024-05-25 8682/week @ 2024-06-01 7502/week @ 2024-06-08 8830/week @ 2024-06-15 10022/week @ 2024-06-22 8687/week @ 2024-06-29 6485/week @ 2024-07-06 7952/week @ 2024-07-13 7672/week @ 2024-07-20 8637/week @ 2024-07-27 7709/week @ 2024-08-03 8796/week @ 2024-08-10 6128/week @ 2024-08-17

32,410 每月下载量
用于 74 个库 (26 直接)

MIT/Apache

230KB
4.5K SLoC

genco

github crates.io docs.rs build status

genco 是一个具有空格感知的近似引用,用于生成美观的代码。

genco 的核心是 quote!quote_in! 过程宏,这些宏简化了 标记流 的构建。

本项目解决了以下语言特定的关注点

  • 导入 — 根据使用情况生成和分组 导入语句,因此您只导入所需的,没有冗余。我们还尽力解决 命名空间冲突

  • 字符串引用 — genco 知道如何 引用字符串。如果语言支持,还可以将值 插入 到引用的字符串中。

  • 结构化缩进 — 引用器依赖于直观的 空格检测 来结构化地排序间距和缩进。这使得 genco 能够以最小的努力生成美观、易读的代码。这也是在像 Python 这样的语言中生成正确行为的代码的必要条件,其中 缩进是有意义的

  • 语言定制 — 在 impl_lang! 宏的帮助下,支持新语言变得轻而易举。


为了在 空格检测 期间支持行更改,我们依赖于夜间的 proc_macro_span 功能。在稳定版本中,我们只能检测列更改。

直到这得到稳定 并且您想要完全功能化的空格检测,您必须使用 nightly 编译器构建和运行使用 genco 的项目。这对于像 python 这样的空格敏感语言来说非常重要。

您可以尝试一下

cargo run --example rust

cargo +nightly run --example rust

支持的语言

以下是在genco中内置支持的语言。

您的最喜欢的语言缺失吗? 打开一个问题!

您可以通过以下方式运行示例之一

cargo +nightly run --example rust

Rust 示例

以下是一个简单的程序,它通过自定义配置将Rust代码输出到标准输出。

use genco::prelude::*;

let hash_map = rust::import("std::collections", "HashMap");

let tokens: rust::Tokens = quote! {
    fn main() {
        let mut m = $hash_map::new();
        m.insert(1u32, 2u32);
    }
};

println!("{}", tokens.to_file_string()?);

这将生成

use std::collections::HashMap;

fn main() {
    let mut m = HashMap::new();
    m.insert(1u32, 2u32);
}

依赖关系

~0.4–0.9MB
~21K SLoC