#protobuf #prost #json #serde-json #serde #deserialize #generate

build pbjson-build

Generates Serialize and Deserialize implementations for prost message types

16 releases

0.7.0 Jul 9, 2024
0.6.2 Sep 18, 2023
0.5.1 Oct 26, 2022
0.3.2 May 31, 2022
0.1.1 Dec 7, 2021

#762 in Encoding

Download history 33609/week @ 2024-07-02 37408/week @ 2024-07-09 36316/week @ 2024-07-16 35474/week @ 2024-07-23 36460/week @ 2024-07-30 34748/week @ 2024-08-06 34846/week @ 2024-08-13 41153/week @ 2024-08-20 43719/week @ 2024-08-27 41089/week @ 2024-09-03 33250/week @ 2024-09-10 34250/week @ 2024-09-17 38024/week @ 2024-09-24 43437/week @ 2024-10-01 43008/week @ 2024-10-08 47141/week @ 2024-10-15

178,389 downloads per month
Used in 87 crates (17 directly)

MIT license

79KB
2K SLoC

pbjson-build consumes the descriptor output of prost-build and generates serde::Serialize and serde::Deserialize implementations that are compliant with the protobuf JSON mapping

Usage

It is recommended you first follow the example in prost-build to familiarise yourself with prost

Add prost-build, prost, pbjson, pbjson-build and pbjson-types to your Cargo.toml

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

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

Next create a build.rs containing the following

// 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"])?;

Finally within 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"));

The module will now contain the generated prost structs for your protobuf definition along with compliant implementations of serde::Serialize and serde::Deserialize

Dependencies

~1MB
~17K SLoC