1 use std::{env, path::PathBuf}; 2 3 fn main() { 4 tonic_build::configure() 5 .type_attribute("routeguide.Point", "#[derive(Hash)]") 6 .compile(&["proto/routeguide/route_guide.proto"], &["proto"]) 7 .unwrap(); 8 9 let out_dir = PathBuf::from(env::var("OUT_DIR").unwrap()); 10 tonic_build::configure() 11 .file_descriptor_set_path(out_dir.join("helloworld_descriptor.bin")) 12 .compile(&["proto/helloworld/helloworld.proto"], &["proto"]) 13 .unwrap(); 14 15 tonic_build::compile_protos("proto/echo/echo.proto").unwrap(); 16 17 tonic_build::configure() 18 .server_mod_attribute("attrs", "#[cfg(feature = \"server\")]") 19 .server_attribute("Echo", "#[derive(PartialEq)]") 20 .client_mod_attribute("attrs", "#[cfg(feature = \"client\")]") 21 .client_attribute("Echo", "#[derive(PartialEq)]") 22 .compile(&["proto/attrs/attrs.proto"], &["proto"]) 23 .unwrap(); 24 25 tonic_build::configure() 26 .build_server(false) 27 .compile( 28 &["proto/googleapis/google/pubsub/v1/pubsub.proto"], 29 &["proto/googleapis"], 30 ) 31 .unwrap(); 32 33 build_json_codec_service(); 34 } 35 36 // Manually define the json.helloworld.Greeter service which used a custom JsonCodec to use json 37 // serialization instead of protobuf for sending messages on the wire. 38 // This will result in generated client and server code which relies on its request, response and 39 // codec types being defined in a module `crate::common`. 40 // 41 // See the client/server examples defined in `src/json-codec` for more information. 42 fn build_json_codec_service() { 43 let greeter_service = tonic_build::manual::Service::builder() 44 .name("Greeter") 45 .package("json.helloworld") 46 .method( 47 tonic_build::manual::Method::builder() 48 .name("say_hello") 49 .route_name("SayHello") 50 .input_type("crate::common::HelloRequest") 51 .output_type("crate::common::HelloResponse") 52 .codec_path("crate::common::JsonCodec") 53 .build(), 54 ) 55 .build(); 56 57 tonic_build::manual::Builder::new().compile(&[greeter_service]); 58 } 59