#serde-json #protobuf #json #serde

build pbjson-build

Generates Serialize and Deserialize implementations for prost message types

15 releases

0.6.2 Sep 18, 2023
0.5.1 Oct 26, 2022
0.3.2 May 31, 2022
0.2.3 Mar 8, 2022
0.1.1 Dec 7, 2021

#1845 in Encoding

Download history 30446/week @ 2023-12-13 22824/week @ 2023-12-20 16736/week @ 2023-12-27 28605/week @ 2024-01-03 30295/week @ 2024-01-10 31941/week @ 2024-01-17 33345/week @ 2024-01-24 29880/week @ 2024-01-31 28126/week @ 2024-02-07 27753/week @ 2024-02-14 30304/week @ 2024-02-21 33552/week @ 2024-02-28 28702/week @ 2024-03-06 31320/week @ 2024-03-13 30354/week @ 2024-03-20 23312/week @ 2024-03-27

120,950 downloads per month
Used in 67 crates (13 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

~1.3–1.8MB
~37K SLoC