use std::io::stdin; use std::io::stdout; use std::str; use protobuf::descriptor::FileDescriptorProto; use protobuf::plugin::*; use protobuf::Message; use protobuf_parse::ProtoPathBuf; pub struct GenRequest<'a> { pub file_descriptors: &'a [FileDescriptorProto], pub files_to_generate: &'a [ProtoPathBuf], pub parameter: &'a str, } pub struct GenResult { pub name: String, pub content: Vec, } pub fn plugin_main(gen: F) -> anyhow::Result<()> where F: Fn(&GenRequest) -> anyhow::Result>, { let req = CodeGeneratorRequest::parse_from_reader(&mut stdin()).unwrap(); let result = gen(&GenRequest { file_descriptors: &req.proto_file, files_to_generate: &req .file_to_generate .iter() .map(|n| ProtoPathBuf::new(n.to_owned())) .collect::>>()?, parameter: req.parameter(), })?; let mut resp = CodeGeneratorResponse::new(); resp.set_supported_features(code_generator_response::Feature::FEATURE_PROTO3_OPTIONAL as u64); resp.file = result .iter() .map(|file| { let mut r = code_generator_response::File::new(); r.set_name(file.name.to_string()); r.set_content(str::from_utf8(file.content.as_ref()).unwrap().to_string()); r }) .collect(); resp.write_to_writer(&mut stdout()).unwrap(); Ok(()) }