sheets_diff/core/
utils.rs1pub 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
13pub 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
45pub 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}