1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
use super::*;
impl Table {
pub fn new<T: Borrow<str>>(raw_csv: T) -> Result<Self, Box<dyn Error>> {
let mut reader = csv::ReaderBuilder::new()
.has_headers(false)
.from_reader(raw_csv.borrow().as_bytes());
let mut raw_csv_table: Vec<Vec<String>> = vec![];
for record in reader.records() {
match record {
Ok(record) => {
raw_csv_table.push(record.iter().map(|item| item.to_owned()).collect())
}
_ => return Err(Box::new(TableError::CSVParseError)),
}
}
let mut raw_table = vec![];
let mut tree_table = vec![];
let mut refs_table = vec![];
let mut refs_to_table = vec![];
let mut calculated_table = vec![];
for raw_csv_line in raw_csv_table {
let mut raw_line = vec![];
let mut tree_line = vec![];
let mut refs_line = vec![];
let mut refs_to_line = vec![];
let mut calculated_line = vec![];
for raw_item in raw_csv_line {
let (tree, refs) = Self::build_tree(raw_item.clone());
raw_line.push(raw_item);
refs_line.push(vec![]);
refs_to_line.push(refs);
tree_line.push(tree);
calculated_line.push(Value::Error);
}
raw_table.push(raw_line);
tree_table.push(tree_line);
refs_table.push(refs_line);
refs_to_table.push(refs_to_line);
calculated_table.push(calculated_line);
}
for y in 0..refs_table.len() {
for x in 0..refs_table[y].len() {
for &(x_of_src, y_of_src) in &refs_to_table[y][x] {
if y_of_src < refs_table.len() && x_of_src < refs_table[y].len() {
refs_table[y_of_src][x_of_src].push((x, y));
}
}
}
}
for y in 0..tree_table.len() {
for x in 0..tree_table[y].len() {
if !refs_table[y][x].contains(&(x, y)) {
Self::calc(x, y, &tree_table, &refs_table, &mut calculated_table);
}
}
}
Ok(Table {
raw_table,
tree_table,
refs_table,
refs_to_table,
calculated_table,
current_pos_y: 0,
})
}
}