sheets_diff/core/
utils.rs

1/// filter sheets whose name is equal
2pub fn filter_same_name_sheets<'a>(
3    old_sheets: &'a Vec<String>,
4    new_sheets: &'a Vec<String>,
5) -> Vec<String> {
6    old_sheets
7        .iter()
8        .filter(|s| new_sheets.contains(s))
9        .map(|s| s.to_owned())
10        .collect()
11}
12
13/// get range to compare
14/// return: (start_row, start_col, end_row, end_col)
15pub fn diff_range<'a>(
16    old_start: Option<(u32, u32)>,
17    new_start: Option<(u32, u32)>,
18    old_end: Option<(u32, u32)>,
19    new_end: Option<(u32, u32)>,
20) -> (u32, u32, u32, u32) {
21    let (old_start_row, old_start_col) = match old_start {
22        Some((row, col)) => (row, col),
23        None => (u32::MAX, u32::MAX),
24    };
25    let (new_start_row, new_start_col) = match new_start {
26        Some((row, col)) => (row, col),
27        None => (u32::MAX, u32::MAX),
28    };
29    let (old_end_row, old_end_col) = match old_end {
30        Some((row, col)) => (row, col),
31        None => (u32::MIN, u32::MIN),
32    };
33    let (new_end_row, new_end_col) = match new_end {
34        Some((row, col)) => (row, col),
35        None => (u32::MIN, u32::MIN),
36    };
37    let start_row = old_start_row.min(new_start_row);
38    let start_col = old_start_col.min(new_start_col);
39    let end_row = old_end_row.max(new_end_row);
40    let end_col = old_end_col.max(new_end_col);
41
42    (start_row, start_col, end_row + 1, end_col + 1)
43}
44
45/// convert (row, col) to cell address str
46pub fn cell_pos_to_address(row: usize, col: usize) -> String {
47    let col_letter = (col as u8 - 1) / 26;
48    let col_index = (col as u8 - 1) % 26;
49
50    let col_char = if col_letter == 0 {
51        ((b'A' + col_index) as char).to_string()
52    } else {
53        let first_char = (b'A' + col_letter - 1) as char;
54        let second_char = (b'A' + col_index) as char;
55        format!("{}{}", first_char, second_char)
56    };
57
58    format!("{}{}", col_char, row)
59}