use gents_derives::TS;
use logisheets_base::BlockId;
use crate::controller::block_key_guard::keys_by_value;
use super::Workbook;
#[derive(Debug, Clone, TS)]
#[ts(file_name = "duplicate_block_key.ts", rename_all = "camelCase")]
pub struct DuplicateBlockKey {
pub sheet_idx: usize,
pub block_id: BlockId,
pub block_name: String,
pub key: String,
pub records: Vec<usize>,
}
impl Workbook {
pub fn duplicate_block_keys(&self) -> Vec<DuplicateBlockKey> {
let status = &self.controller.status;
let mut out: Vec<DuplicateBlockKey> = Vec::new();
for (sheet_id, block_id) in status.block_schema_manager.schemas.keys() {
let Some(sheet_idx) = status.sheet_info_manager.get_sheet_idx(sheet_id) else {
continue;
};
let Some(by_value) = keys_by_value(status, *sheet_id, *block_id) else {
continue;
};
let block_name = status
.block_schema_manager
.fetch_block_ref_name(*sheet_id, *block_id)
.unwrap_or_default();
for (key, records) in by_value {
if records.len() < 2 {
continue;
}
out.push(DuplicateBlockKey {
sheet_idx,
block_id: *block_id,
block_name: block_name.clone(),
key,
records,
});
}
}
out.sort_by(|a, b| {
(a.sheet_idx, a.block_id, &a.key).cmp(&(b.sheet_idx, b.block_id, &b.key))
});
out
}
}