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