#protobuf #json-rpc #json

pbjsonrpc-build

Generates jsonrpsee trait for prost message types

11 unstable releases

0.24.1 Nov 6, 2024
0.18.1 Jan 5, 2024
0.18.0 Oct 20, 2023
0.17.0 Apr 20, 2023
0.0.3 Jun 4, 2022

#384 in Encoding

Download history 42/week @ 2024-07-29 13/week @ 2024-09-23 188/week @ 2024-11-04 120/week @ 2024-11-11

308 downloads per month
Used in 2 crates (via lebai-proto)

MIT license

43KB
1K SLoC

Pbjsonrpc-build

Automatically generate jsonrpsee Trait for auto-generated prost types.

Usage

[dependencies]
pbjson = "0.3"
pbjson-types = "0.3"
prost = "0.10"
prost-types = "0.10"

[build-dependencies]
pbjson-build = "0.3"
pbjsonrpc-build = "0"
prost-build = "0.10"

Next create a build.rs containing the following

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"])?;
pbjsonrpc_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"));
/// Generated by [`pbjsonrpc-build`]
include!(concat!(env!("OUT_DIR"), "/mypackage.jsonrpc.rs"));

Dependencies

~1MB
~16K SLoC