1 use std::collections::HashMap;
2 
3 use protobuf::descriptor::FileDescriptorProto;
4 use protobuf::reflect::FileDescriptor;
5 use protobuf_parse::ProtoPath;
6 use protobuf_parse::ProtoPathBuf;
7 
8 use crate::compiler_plugin;
9 use crate::customize::ctx::CustomizeElemCtx;
10 use crate::customize::CustomizeCallback;
11 use crate::gen::file::gen_file;
12 use crate::gen::mod_rs::gen_mod_rs;
13 use crate::gen::scope::RootScope;
14 use crate::gen::well_known_types::gen_well_known_types_mod;
15 use crate::Customize;
16 
gen_all( file_descriptors: &[FileDescriptorProto], parser: &str, files_to_generate: &[ProtoPathBuf], customize: &Customize, customize_callback: &dyn CustomizeCallback, ) -> anyhow::Result<Vec<compiler_plugin::GenResult>>17 pub(crate) fn gen_all(
18     file_descriptors: &[FileDescriptorProto],
19     parser: &str,
20     files_to_generate: &[ProtoPathBuf],
21     customize: &Customize,
22     customize_callback: &dyn CustomizeCallback,
23 ) -> anyhow::Result<Vec<compiler_plugin::GenResult>> {
24     let file_descriptors = FileDescriptor::new_dynamic_fds(file_descriptors.to_vec(), &[])?;
25 
26     let root_scope = RootScope {
27         file_descriptors: &file_descriptors,
28     };
29 
30     let mut results: Vec<compiler_plugin::GenResult> = Vec::new();
31     let files_map: HashMap<&ProtoPath, &FileDescriptor> = file_descriptors
32         .iter()
33         .map(|f| Ok((ProtoPath::new(f.proto().name())?, f)))
34         .collect::<Result<_, anyhow::Error>>()?;
35 
36     let mut mods = Vec::new();
37 
38     let customize = CustomizeElemCtx {
39         for_elem: customize.clone(),
40         for_children: customize.clone(),
41         callback: customize_callback,
42     };
43 
44     for file_name in files_to_generate {
45         let file = files_map.get(file_name.as_path()).expect(&format!(
46             "file not found in file descriptors: {:?}, files: {:?}",
47             file_name,
48             files_map.keys()
49         ));
50         let gen_file_result = gen_file(file, &files_map, &root_scope, &customize, parser)?;
51         results.push(gen_file_result.compiler_plugin_result);
52         mods.push(gen_file_result.mod_name);
53     }
54 
55     if customize.for_elem.inside_protobuf.unwrap_or(false) {
56         results.push(gen_well_known_types_mod());
57     }
58 
59     if customize.for_elem.gen_mod_rs.unwrap_or(true) {
60         results.push(gen_mod_rs(&mods));
61     }
62 
63     Ok(results)
64 }
65