#jq #lexer #ast #pure #parser #xq

xq-lang

jq 的词法分析器、解析器和 AST

1 个不稳定版本

0.0.1 2022 年 3 月 30 日

#38#jq

Download history 17/week @ 2024-03-14 16/week @ 2024-03-21 31/week @ 2024-03-28 24/week @ 2024-04-04 29/week @ 2024-04-11 24/week @ 2024-04-18 213/week @ 2024-04-25 38/week @ 2024-05-02 119/week @ 2024-05-09 22/week @ 2024-05-16 14/week @ 2024-05-23 13/week @ 2024-05-30 14/week @ 2024-06-06 10/week @ 2024-06-13 117/week @ 2024-06-20 36/week @ 2024-06-27

每月 179 次下载
3 包中使用 (直接使用 2 个)

MIT 许可证

39KB
1K SLoC

CI crates.io

XQ

在 Rust 中完全重写的 JQ

注意

此程序处于开发中。你可能想使用 jq 的原始实现,或由 itchyny 构建的纯 Go 实现 gojq,或另一个 Rust 实现 jaq

当前状态

  • 大多数需要语法支持的 jq 组件都已实现并针对从 jq 用户手册 中取出的查询进行了测试。例外的是导入和模块头。
  • 缺少许多内置函数,包括需要内在实现的函数。
  • 需要更多的单元测试。大多数 CLI 选项都缺失。
  • 支持 JSON 和 YAML 格式。

目标

  • 学习 jq。

想法

  • 由于我们使用 serde 来反序列化输入/序列化输出,我们应该能够轻松支持任何具有 serde 实现的格式(并且具有多文档支持),除了那些需要方案(protobuf、thrift 等)。

  • 作为库,我们应该能够使任何实现了 Serialize 的作为输入类型,任何实现了 Deserialize 的作为输出类型。因此,在理论上,我们应该能够编写一个可以处理以下情况的库;

    #[derive(Serialize)]
    struct GitHubRepo {
        user_name: String,
        repo_name: String,
        stars: usize,
    }
    #[derive(Deserialize)]
    struct User {
        name: String,
        total_stars: usize,
    }
    let repos: Vec<GitHubRepo> = fetch_repos();
    let users: Vec<User> = xq::somefunction_slurp<GitHubRepo, User>(repos, r#"
        group_by(.user_name)[]
        | { name: .[0].user_name, total_stars: ([.[].stars] | add) }
    "#).collect();
    

    我的意思是,这并不是真的应该使用的东西。这只是可能且有趣的事情...不是吗?

安装和运行

你确定要使用这个吗??? 这不是一个日常可用的阶段。尽管如此,如果你想尝试,你可以通过以下方式安装:

$ cargo install xq
$ cat whatever.json | xq 'query goes here'

。 如果你更愿意下载预构建的二进制文件,你可以手动从 最新版本 下载,或者使用 cargo-binstall。无论哪种方式,依赖项的许可证文本都包含在下载的存档中 about.html 文件中。

你也可以将其克隆到本地并运行

$ cargo install --path path-to-cloned-dir
$ cat whatever.json | xq 'query goes here'

。 或者,

$ cat whatever.json | cargo run -- 'query goes here'

在克隆的目录中尝试它们而不需要安装。

卸载

$ cargo uninstall xq

如果您通过 cargo install 安装,也请删除克隆的目录。

发布新版本

个人备注。

$ git switch master                 # make sure you're on the master branch
$ cargo release patch               # to dry-run the release
$ cargo release patch --execute     # to actually execute the release

发布工作区成员时,请传递 --workspace

致谢

  • 尽管这并非直接翻译,但我参考了由 Stephen Dolan 开发的 jq 以及由 itchyny 开发的 gojq。感谢您提供的有趣产品!

鸣谢

作者

Mi_Sawa

许可证

MIT。请参阅 LICENSE 文件。

依赖项

~1.8–4MB
~68K SLoC