1 个不稳定版本
0.0.1 | 2022 年 3 月 30 日 |
---|
#38 在 #jq
每月 179 次下载
在 3 个 包中使用 (直接使用 2 个)
39KB
1K SLoC
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。感谢您提供的有趣产品!
鸣谢
- 在 tests/from_manual 中的测试用例来自 jq 用户手册,版权所有 (C) 2012 Stephen Dolan,许可协议为 CC BY 3.0。更多详情请参考 mod.rs。
作者
许可证
MIT。请参阅 LICENSE 文件。
依赖项
~1.8–4MB
~68K SLoC