csvx 0.1.17

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

pub struct Node {
    base: Box<ThreadSafeNode>,
    number: Box<ThreadSafeNode>,
}

impl super::Node for Node {
    fn new(seqs: Vec<Vec<Token>>) -> (Box<ThreadSafeNode>, Vec<(usize, usize)>) {
        let (base, mut base_refs) = parse(&seqs[0]);
        let (number, mut number_refs) = parse(&seqs[1]);
        base_refs.append(&mut number_refs);
        (Box::new(Self { base, number }), base_refs)
    }
    fn calc(
        &mut self,
        calculated_table: &Vec<Vec<Value>>,
    ) -> (Value, Vec<(usize, usize)>, Vec<(usize, usize)>) {
        let mut base = self.base.calc(calculated_table);
        let mut number = self.number.calc(calculated_table);

        let value = match (base.0, number.0) {
            (Value::Integer(base), Value::Integer(number)) => {
                Value::Float((number as f64).log(base as f64))
            }
            (Value::Integer(base), Value::Float(number)) => Value::Float(number.log(base as f64)),
            (Value::Float(base), Value::Integer(number)) => Value::Float((number as f64).log(base)),
            (Value::Float(base), Value::Float(number)) => Value::Float(number.log(base)),
            _ => Value::Error,
        };

        base.1.append(&mut number.1);
        base.2.append(&mut number.2);
        (value, base.1, base.2)
    }
}