use crate::hir::{Import, ImportItem};
fn process_whole_module_import(
import: &Import,
module_mapper: &crate::module_mapper::ModuleMapper,
imported_modules: &mut std::collections::HashMap<String, crate::module_mapper::ModuleMapping>,
) {
if let Some(mapping) = module_mapper.get_mapping(&import.module) {
imported_modules.insert(import.module.clone(), mapping.clone());
}
}
fn process_import_item(
import_module: &str,
item_name: &str,
import_key: &str,
mapping: &crate::module_mapper::ModuleMapping,
imported_items: &mut std::collections::HashMap<String, String>,
) {
if let Some(rust_name) = mapping.item_map.get(item_name) {
if import_module == "typing" && !rust_name.is_empty() {
imported_items.insert(import_key.to_string(), rust_name.clone());
} else if !mapping.rust_path.is_empty() {
imported_items.insert(
import_key.to_string(),
format!("{}::{}", mapping.rust_path, rust_name),
);
}
}
}
fn process_specific_items_import(
import: &Import,
module_mapper: &crate::module_mapper::ModuleMapper,
imported_items: &mut std::collections::HashMap<String, String>,
) {
if let Some(mapping) = module_mapper.get_mapping(&import.module) {
for item in &import.items {
match item {
ImportItem::Named(name) => {
process_import_item(&import.module, name, name, mapping, imported_items);
}
ImportItem::Aliased { name, alias } => {
process_import_item(&import.module, name, alias, mapping, imported_items);
}
}
}
}
}
pub fn process_module_imports(
imports: &[Import],
module_mapper: &crate::module_mapper::ModuleMapper,
) -> (
std::collections::HashMap<String, crate::module_mapper::ModuleMapping>,
std::collections::HashMap<String, String>,
) {
let mut imported_modules = std::collections::HashMap::new();
let mut imported_items = std::collections::HashMap::new();
for import in imports {
if import.items.is_empty() {
process_whole_module_import(import, module_mapper, &mut imported_modules);
} else {
process_specific_items_import(import, module_mapper, &mut imported_items);
}
}
(imported_modules, imported_items)
}