3939use std:: collections:: HashMap ;
4040
4141use crate :: Customize ;
42- use protobuf:: compiler_plugin;
43- use protobuf:: descriptor:: * ;
44- use protobuf:: descriptorx:: * ;
42+ use protobuf:: {
43+ compiler_plugin:: { GenRequest , GenResult } ,
44+ descriptor:: * ,
45+ descriptorx:: * ,
46+ plugin:: {
47+ CodeGeneratorRequest , CodeGeneratorResponse , CodeGeneratorResponse_Feature ,
48+ CodeGeneratorResponse_File ,
49+ } ,
50+ Message ,
51+ } ;
4552use protobuf_codegen:: code_writer:: CodeWriter ;
4653use std:: fs:: File ;
47- use std:: io:: { self , Write } ;
54+ use std:: io:: { self , stdin , stdout , Write } ;
4855use std:: path:: Path ;
4956
5057use super :: util:: {
@@ -659,7 +666,7 @@ fn gen_file(
659666 file : & FileDescriptorProto ,
660667 root_scope : & RootScope ,
661668 customize : & Customize ,
662- ) -> Option < compiler_plugin :: GenResult > {
669+ ) -> Option < GenResult > {
663670 if file. get_service ( ) . is_empty ( ) {
664671 return None ;
665672 }
@@ -685,7 +692,7 @@ fn gen_file(
685692 }
686693 }
687694
688- Some ( compiler_plugin :: GenResult {
695+ Some ( GenResult {
689696 name : base + "_ttrpc.rs" ,
690697 content : v,
691698 } )
@@ -695,7 +702,7 @@ pub fn gen(
695702 file_descriptors : & [ FileDescriptorProto ] ,
696703 files_to_generate : & [ String ] ,
697704 customize : & Customize ,
698- ) -> Vec < compiler_plugin :: GenResult > {
705+ ) -> Vec < GenResult > {
699706 let files_map: HashMap < & str , & FileDescriptorProto > =
700707 file_descriptors. iter ( ) . map ( |f| ( f. get_name ( ) , f) ) . collect ( ) ;
701708
@@ -736,7 +743,7 @@ pub fn gen_and_write(
736743}
737744
738745pub fn protoc_gen_grpc_rust_main ( ) {
739- compiler_plugin :: plugin_main ( |file_descriptors, files_to_generate| {
746+ plugin_main ( |file_descriptors, files_to_generate| {
740747 gen (
741748 file_descriptors,
742749 files_to_generate,
@@ -746,3 +753,40 @@ pub fn protoc_gen_grpc_rust_main() {
746753 )
747754 } ) ;
748755}
756+
757+ fn plugin_main < F > ( gen : F )
758+ where
759+ F : Fn ( & [ FileDescriptorProto ] , & [ String ] ) -> Vec < GenResult > ,
760+ {
761+ plugin_main_2 ( |r| gen ( r. file_descriptors , r. files_to_generate ) )
762+ }
763+
764+ fn plugin_main_2 < F > ( gen : F )
765+ where
766+ F : Fn ( & GenRequest ) -> Vec < GenResult > ,
767+ {
768+ let req = CodeGeneratorRequest :: parse_from_reader ( & mut stdin ( ) ) . unwrap ( ) ;
769+ let result = gen ( & GenRequest {
770+ file_descriptors : & req. get_proto_file ( ) ,
771+ files_to_generate : & req. get_file_to_generate ( ) ,
772+ parameter : req. get_parameter ( ) ,
773+ } ) ;
774+ let mut resp = CodeGeneratorResponse :: new ( ) ;
775+ resp. set_supported_features ( CodeGeneratorResponse_Feature :: FEATURE_PROTO3_OPTIONAL as u64 ) ;
776+ resp. set_file (
777+ result
778+ . iter ( )
779+ . map ( |file| {
780+ let mut r = CodeGeneratorResponse_File :: new ( ) ;
781+ r. set_name ( file. name . to_string ( ) ) ;
782+ r. set_content (
783+ std:: str:: from_utf8 ( file. content . as_ref ( ) )
784+ . unwrap ( )
785+ . to_string ( ) ,
786+ ) ;
787+ r
788+ } )
789+ . collect ( ) ,
790+ ) ;
791+ resp. write_to_writer ( & mut stdout ( ) ) . unwrap ( ) ;
792+ }
0 commit comments