csvx 0.1.17

Comma-Separated Values eXtended
Documentation
use super::*;

pub struct Node {
    condition: Box<ThreadSafeNode>,
    on_true: Box<ThreadSafeNode>,
    on_false: Box<ThreadSafeNode>,
}

impl super::Node for Node {
    fn new(seqs: Vec<Vec<Token>>) -> (Box<ThreadSafeNode>, Vec<(usize, usize)>) {
        let (condition, mut condition_refs) = parse(&seqs[0]);
        let (on_true, mut on_true_refs) = parse(&seqs[1]);
        let (on_false, mut on_false_refs) = parse(&seqs[2]);
        condition_refs.append(&mut on_true_refs);
        condition_refs.append(&mut on_false_refs);
        (
            Box::new(Self {
                condition,
                on_true,
                on_false,
            }),
            condition_refs,
        )
    }
    fn calc(
        &mut self,
        calculated_table: &Vec<Vec<Value>>,
    ) -> (Value, Vec<(usize, usize)>, Vec<(usize, usize)>) {
        let mut condition = self.condition.calc(calculated_table);
        let mut on_true = self.on_true.calc(calculated_table);
        let mut on_false = self.on_false.calc(calculated_table);

        let value = if let Value::Boolean(condition) = condition.0 {
            if condition {
                on_true.0
            } else {
                on_false.0
            }
        } else {
            Value::Error
        };

        condition.1.append(&mut on_true.1);
        condition.1.append(&mut on_false.1);
        condition.2.append(&mut on_true.2);
        condition.2.append(&mut on_false.2);
        (value, condition.1, condition.2)
    }
}