csvx/table/
update.rs

1use super::*;
2
3impl Table {
4    /// Update an item within a CSVX table
5    ///
6    /// use 0-indexed values for `x` and `y`.
7    ///
8    /// # Example
9    /// ```
10    /// table.update(0, 0, "true")?;
11    /// println!("UPDATED TABLE:\n{}", table.export_calculated_table()?);
12    /// ```
13    pub fn update<T: Borrow<str>>(
14        &mut self,
15        x: usize,
16        y: usize,
17        raw_string: T,
18    ) -> Result<(), TableError> {
19        let raw_table = &mut self.raw_table;
20        let tree_table = &mut self.tree_table;
21        let ref_src_table = &mut self.ref_src_table;
22        let dependents_table = &mut self.dependents_table;
23        let calculated_table = &mut self.calculated_table;
24
25        if raw_table.len() <= y || raw_table[y].len() <= x {
26            return Err(TableError::OutOfRange { x, y });
27        }
28        raw_table[y][x] = raw_string.borrow().to_string();
29
30        for (x_of_src, y_of_src) in dependents_table[y][x].keys() {
31            let x_of_src = *x_of_src;
32            let y_of_src = *y_of_src;
33            if y_of_src < ref_src_table.len() && x_of_src < ref_src_table[y].len() {
34                ref_src_table[y_of_src][x_of_src].retain(|&v| v != (x, y));
35            }
36        }
37
38        let (tree, refs) = Self::build_tree(&raw_string);
39
40        let mut dependents = HashMap::new();
41        for dependent in refs {
42            *(dependents.entry(dependent).or_insert(0)) += 1;
43        }
44
45        tree_table[y][x] = tree;
46        dependents_table[y][x] = dependents;
47
48        for &(x_of_src, y_of_src) in dependents_table[y][x].keys() {
49            if y_of_src < ref_src_table.len() && x_of_src < ref_src_table[y].len() {
50                ref_src_table[y_of_src][x_of_src].push((x, y));
51            }
52        }
53
54        Self::calc(
55            x,
56            y,
57            tree_table,
58            ref_src_table,
59            dependents_table,
60            calculated_table,
61            &mut vec![],
62        );
63        Ok(())
64    }
65}