use std::{env, path::PathBuf}; fn main() { tonic_build::configure() .type_attribute("routeguide.Point", "#[derive(Hash)]") .compile(&["proto/routeguide/route_guide.proto"], &["proto"]) .unwrap(); let out_dir = PathBuf::from(env::var("OUT_DIR").unwrap()); tonic_build::configure() .file_descriptor_set_path(out_dir.join("helloworld_descriptor.bin")) .compile(&["proto/helloworld/helloworld.proto"], &["proto"]) .unwrap(); tonic_build::compile_protos("proto/echo/echo.proto").unwrap(); tonic_build::compile_protos("proto/unaryecho/echo.proto").unwrap(); tonic_build::configure() .server_mod_attribute("attrs", "#[cfg(feature = \"server\")]") .server_attribute("Echo", "#[derive(PartialEq)]") .client_mod_attribute("attrs", "#[cfg(feature = \"client\")]") .client_attribute("Echo", "#[derive(PartialEq)]") .compile(&["proto/attrs/attrs.proto"], &["proto"]) .unwrap(); tonic_build::configure() .build_server(false) .compile( &["proto/googleapis/google/pubsub/v1/pubsub.proto"], &["proto/googleapis"], ) .unwrap(); build_json_codec_service(); } // Manually define the json.helloworld.Greeter service which used a custom JsonCodec to use json // serialization instead of protobuf for sending messages on the wire. // This will result in generated client and server code which relies on its request, response and // codec types being defined in a module `crate::common`. // // See the client/server examples defined in `src/json-codec` for more information. fn build_json_codec_service() { let greeter_service = tonic_build::manual::Service::builder() .name("Greeter") .package("json.helloworld") .method( tonic_build::manual::Method::builder() .name("say_hello") .route_name("SayHello") .input_type("crate::common::HelloRequest") .output_type("crate::common::HelloResponse") .codec_path("crate::common::JsonCodec") .build(), ) .build(); tonic_build::manual::Builder::new().compile(&[greeter_service]); }