diff options
Diffstat (limited to 'src/compiler_plugin.rs')
-rw-r--r-- | src/compiler_plugin.rs | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/src/compiler_plugin.rs b/src/compiler_plugin.rs new file mode 100644 index 0000000..2a3b1d0 --- /dev/null +++ b/src/compiler_plugin.rs @@ -0,0 +1,53 @@ +// TODO: move into separate crate +#![doc(hidden)] + +use plugin::*; +use protobuf::descriptor::FileDescriptorProto; +use protobuf::parse_from_reader; +use protobuf::Message; +use std::io::stdin; +use std::io::stdout; +use std::str; + +pub struct GenRequest<'a> { + pub file_descriptors: &'a [FileDescriptorProto], + pub files_to_generate: &'a [String], + pub parameter: &'a str, +} + +pub struct GenResult { + pub name: String, + pub content: Vec<u8>, +} + +pub fn plugin_main<F>(gen: F) +where + F: Fn(&[FileDescriptorProto], &[String]) -> Vec<GenResult>, +{ + plugin_main_2(|r| gen(r.file_descriptors, r.files_to_generate)) +} + +pub fn plugin_main_2<F>(gen: F) +where + F: Fn(&GenRequest) -> Vec<GenResult>, +{ + let req = parse_from_reader::<CodeGeneratorRequest>(&mut stdin()).unwrap(); + let result = gen(&GenRequest { + file_descriptors: &req.get_proto_file(), + files_to_generate: &req.get_file_to_generate(), + parameter: req.get_parameter(), + }); + let mut resp = CodeGeneratorResponse::new(); + resp.set_file( + result + .iter() + .map(|file| { + let mut r = CodeGeneratorResponse_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(); +} |