diff options
Diffstat (limited to 'src/compiler_plugin.rs')
-rw-r--r-- | src/compiler_plugin.rs | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/src/compiler_plugin.rs b/src/compiler_plugin.rs new file mode 100644 index 0000000..b7ff6ea --- /dev/null +++ b/src/compiler_plugin.rs @@ -0,0 +1,48 @@ +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<u8>, +} + +pub fn plugin_main<F>(gen: F) -> anyhow::Result<()> +where + F: Fn(&GenRequest) -> anyhow::Result<Vec<GenResult>>, +{ + 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::<anyhow::Result<Vec<_>>>()?, + 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(()) +} |