csvx/node/
value.rs

1use super::*;
2use std::fmt;
3
4/// Value types of CSVX items
5#[derive(Clone)]
6pub enum Value {
7    Error,
8    Integer(i64),
9    Float(f64),
10    String(String),
11    Boolean(bool),
12    Ref(usize, usize),
13    Range(usize, usize, usize, usize),
14    Empty,
15}
16
17impl Node for Value {
18    fn new(seqs: Vec<Vec<Token>>) -> (Box<ThreadSafeNode>, Vec<(usize, usize)>) {
19        match seqs[0][0].clone() {
20            Token::Integer(x) => (Box::new(Value::Integer(x)), vec![]),
21            Token::Float(x) => (Box::new(Value::Float(x)), vec![]),
22            Token::String(x) => (Box::new(Value::String(x)), vec![]),
23            Token::Boolean(x) => (Box::new(Value::Boolean(x)), vec![]),
24            Token::Ref(x, y) => (Box::new(Value::Ref(x, y)), vec![(x, y)]),
25            Token::Range(x1, y1, x2, y2) => (Box::new(Value::Range(x1, y1, x2, y2)), vec![]),
26            _ => (Box::new(Value::Error), vec![]),
27        }
28    }
29
30    fn calc(
31        &mut self,
32        calculated_table: &Vec<Vec<Value>>,
33    ) -> (Value, Vec<(usize, usize)>, Vec<(usize, usize)>) {
34        let value = match self {
35            Value::Ref(x, y) => {
36                if let Some(row) = calculated_table.get(*y) {
37                    if let Some(item) = row.get(*x) {
38                        item.clone()
39                    } else {
40                        Value::Error
41                    }
42                } else {
43                    Value::Error
44                }
45            }
46            _ => self.clone(),
47        };
48
49        (value, vec![], vec![])
50    }
51}
52
53impl fmt::Display for Value {
54    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
55        match self {
56            Value::Integer(x) => write!(f, "{}", x),
57            Value::Float(x) => write!(f, "{}", x),
58            Value::String(x) => write!(f, "\"{}\"", x),
59            Value::Boolean(x) => write!(f, "{}", x),
60            Value::Ref(x, y) => write!(f, "({},{})", x, y),
61            Value::Range(x1, y1, x2, y2) => write!(f, "({},{}) : ({},{})", x1, y1, x2, y2),
62            Value::Empty => write!(f, ""),
63            _ => write!(f, "Error"),
64        }
65    }
66}