// 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, } pub fn plugin_main(gen: F) where F: Fn(&[FileDescriptorProto], &[String]) -> Vec, { plugin_main_2(|r| gen(r.file_descriptors, r.files_to_generate)) } pub fn plugin_main_2(gen: F) where F: Fn(&GenRequest) -> Vec, { let req = parse_from_reader::(&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(); }