#jq #pure #original #called #built #xq #gnostr-xq-a

bin+lib gnostr-xq

gnostr-xq:jq的重实现

1个不稳定版本

0.0.0 2024年2月25日

#37#jq

40 每月下载量

MIT 许可证

245KB
6K SLoC

CI crates.io

XQ

JQ 使用Rust纯实现。

注意

此程序处于开发中。您可能希望使用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

LICENSE

MIT。请参阅LICENSE文件。

依赖项

~10–20MB
~320K SLoC