1use super::*;
2use std::fmt;
3
4#[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}