use crate::rules::isort::types::{ImportBlock, Importable};
fn find_block_index(forced_separate: &[String], imp: &dyn Importable) -> usize {
forced_separate
.iter()
.position(|pattern| imp.module_base().starts_with(pattern))
.map_or(0, |position| position + 1)
}
pub(crate) fn split_by_forced_separate<'a>(
block: ImportBlock<'a>,
forced_separate: &[String],
) -> Vec<ImportBlock<'a>> {
if forced_separate.is_empty() {
return vec![block];
}
let mut blocks = vec![ImportBlock::default()]; for _ in forced_separate {
blocks.push(ImportBlock::default());
}
let ImportBlock {
import,
import_from,
import_from_as,
import_from_star,
} = block;
#[expect(
clippy::iter_over_hash_type,
reason = "splitting only moves entries between unordered import blocks"
)]
for (imp, comment_set) in import {
blocks[find_block_index(forced_separate, &imp)]
.import
.insert(imp, comment_set);
}
#[expect(
clippy::iter_over_hash_type,
reason = "splitting only moves entries between unordered import blocks"
)]
for (imp, val) in import_from {
blocks[find_block_index(forced_separate, &imp)]
.import_from
.insert(imp, val);
}
#[expect(
clippy::iter_over_hash_type,
reason = "splitting only moves entries between unordered import blocks"
)]
for ((imp, alias), val) in import_from_as {
blocks[find_block_index(forced_separate, &imp)]
.import_from_as
.insert((imp, alias), val);
}
#[expect(
clippy::iter_over_hash_type,
reason = "splitting only moves entries between unordered import blocks"
)]
for (imp, comment_set) in import_from_star {
blocks[find_block_index(forced_separate, &imp)]
.import_from_star
.insert(imp, comment_set);
}
blocks
}