use std::collections::HashMap; use protobuf::descriptor::FileDescriptorProto; use protobuf::reflect::FileDescriptor; use protobuf_parse::ProtoPath; use protobuf_parse::ProtoPathBuf; use crate::compiler_plugin; use crate::customize::ctx::CustomizeElemCtx; use crate::customize::CustomizeCallback; use crate::gen::file::gen_file; use crate::gen::mod_rs::gen_mod_rs; use crate::gen::scope::RootScope; use crate::gen::well_known_types::gen_well_known_types_mod; use crate::Customize; pub(crate) fn gen_all( file_descriptors: &[FileDescriptorProto], parser: &str, files_to_generate: &[ProtoPathBuf], customize: &Customize, customize_callback: &dyn CustomizeCallback, ) -> anyhow::Result> { let file_descriptors = FileDescriptor::new_dynamic_fds(file_descriptors.to_vec(), &[])?; let root_scope = RootScope { file_descriptors: &file_descriptors, }; let mut results: Vec = Vec::new(); let files_map: HashMap<&ProtoPath, &FileDescriptor> = file_descriptors .iter() .map(|f| Ok((ProtoPath::new(f.proto().name())?, f))) .collect::>()?; let mut mods = Vec::new(); let customize = CustomizeElemCtx { for_elem: customize.clone(), for_children: customize.clone(), callback: customize_callback, }; for file_name in files_to_generate { let file = files_map.get(file_name.as_path()).expect(&format!( "file not found in file descriptors: {:?}, files: {:?}", file_name, files_map.keys() )); let gen_file_result = gen_file(file, &files_map, &root_scope, &customize, parser)?; results.push(gen_file_result.compiler_plugin_result); mods.push(gen_file_result.mod_name); } if customize.for_elem.inside_protobuf.unwrap_or(false) { results.push(gen_well_known_types_mod()); } if customize.for_elem.gen_mod_rs.unwrap_or(true) { results.push(gen_mod_rs(&mods)); } Ok(results) }