#serde-json #protobuf #json #serialization #serde #generate #deserialize

构建 pbjson-build

为 prost 消息类型生成 Serialize 和 Deserialize 实现

16 个版本

0.7.0 2024年7月9日
0.6.2 2023年9月18日
0.5.1 2022年10月26日
0.3.2 2022年5月31日
0.1.1 2021年12月7日

#1279编码

Download history 30740/week @ 2024-04-28 29821/week @ 2024-05-05 34701/week @ 2024-05-12 31605/week @ 2024-05-19 32912/week @ 2024-05-26 30159/week @ 2024-06-02 29989/week @ 2024-06-09 36635/week @ 2024-06-16 38509/week @ 2024-06-23 33950/week @ 2024-06-30 38717/week @ 2024-07-07 34305/week @ 2024-07-14 37007/week @ 2024-07-21 35625/week @ 2024-07-28 35502/week @ 2024-08-04 33474/week @ 2024-08-11

143,953 每月下载量
用于 80 个 crate (15 直接)

MIT 许可证

79KB
2K SLoC

pbjson-build 消耗 prost-build 的描述符输出,并生成符合 protobuf JSON 映射serde::Serializeserde::Deserialize 实现

使用方法

建议您首先遵循 prost-build 中的示例,以熟悉 prost

prost-buildprostpbjsonpbjson-buildpbjson-types 添加到您的 Cargo.toml

[dependencies]
prost = <prost-version>
pbjson = <pbjson-version>
pbjson-types = <pbjson-version>

[build-dependencies]
prost-build = <prost-version>
pbjson-build = <pbjson-version>

然后创建一个包含以下内容的 build.rs

// This assumes protobuf files are under a directory called `protos`
// and in a protobuf package `mypackage`

let root = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("protos");
let proto_files = vec![root.join("myproto.proto")];

// Tell cargo to recompile if any of these proto files are changed
for proto_file in &proto_files {
    println!("cargo:rerun-if-changed={}", proto_file.display());
}

let descriptor_path = PathBuf::from(env::var("OUT_DIR").unwrap())
    .join("proto_descriptor.bin");

prost_build::Config::new()
    // Save descriptors to file
    .file_descriptor_set_path(&descriptor_path)
    // Override prost-types with pbjson-types
    .compile_well_known_types()
    .extern_path(".google.protobuf", "::pbjson_types")
    // Generate prost structs
    .compile_protos(&proto_files, &[root])?;

let descriptor_set = std::fs::read(descriptor_path)?;
pbjson_build::Builder::new()
    .register_descriptors(&descriptor_set)?
    .build(&[".mypackage"])?;

最后在 lib.rs

/// Generated by [`prost-build`]
include!(concat!(env!("OUT_DIR"), "/mypackage.rs"));
/// Generated by [`pbjson-build`]
include!(concat!(env!("OUT_DIR"), "/mypackage.serde.rs"));

该模块现在将包含您 protobuf 定义生成的 prost 结构体以及符合 serde::Serializeserde::Deserialize 的实现

依赖项

~1MB
~16K SLoC