logisheets_controller 1.16.1

Core spreadsheet engine for LogiSheets: formula evaluation, dependency tracking, and undo/redo.
Documentation
macro_rules! assert_or_return {
    ($cond:expr, $error:expr) => {
        if !$cond {
            return CalcVertex::from_error($error);
        }
    };
}

/// Pull the next (optional) argument off an args iterator as an `f64`, using
/// `$default` when it is absent. A present-but-erroring argument early-returns
/// the error from the enclosing function (Excel propagates it).
macro_rules! optional_f64 {
    ($iter:expr, $fetcher:expr, $default:expr) => {
        match $iter.next() {
            Some(__arg) => {
                let __v = $fetcher.get_calc_value(__arg);
                assert_f64_from_calc_value!(__f, __v);
                __f
            }
            None => $default,
        }
    };
}

macro_rules! assert_range_from_calc_value {
    ($var:ident, $value:expr) => {
        let _v = match $value {
            CalcValue::Scalar(v) => {
                let matrix_value = logisheets_base::matrix_value::MatrixValue::from(vec![vec![v]]);
                Some(matrix_value)
            }
            CalcValue::Range(r) => Some(r),
            _ => None,
        };
        if _v.is_none() {
            return CalcVertex::from_error(ast::Error::Num);
        }
        let $var = _v.unwrap();
    };
}

macro_rules! assert_f64_from_calc_value {
    ($var:ident, $value:expr) => {
        let _v = match $value {
            CalcValue::Scalar(v) => Some(v),
            _ => None,
        };
        if _v.is_none() {
            return CalcVertex::from_error(ast::Error::Num);
        }
        let _value = _v.unwrap();
        let _res = match _value {
            Value::Blank => Ok(0_f64),
            Value::Number(n) => Ok(n),
            Value::Text(t) => match t.parse::<f64>() {
                Ok(n) => Ok(n),
                Err(_) => Err(ast::Error::Value),
            },
            Value::Boolean(b) => {
                if b {
                    Ok(1.)
                } else {
                    Ok(0.)
                }
            }
            Value::Error(e) => Err(e),
        };
        if let Err(e) = _res {
            return CalcVertex::from_error(e);
        }
        let $var = _res.unwrap();
    };
}

macro_rules! assert_date_serial_num_from_calc_value {
    ($var:ident, $value:expr) => {
        use logisheets_base::datetime::parse_date_time;
        let _v = match $value {
            CalcValue::Scalar(v) => Some(v),
            _ => None,
        };
        if _v.is_none() {
            return CalcVertex::from_error(ast::Error::Num);
        }
        let _value = _v.unwrap();
        let _res = match _value {
            Value::Blank => Ok(0_f64),
            Value::Number(n) => Ok(n),
            Value::Text(t) => match t.parse::<f64>() {
                Ok(n) => Ok(n),
                Err(_) => match parse_date_time(&t) {
                    Some(f) => Ok(f),
                    None => Err(ast::Error::Value),
                },
            },
            Value::Boolean(b) => {
                if b {
                    Ok(1.)
                } else {
                    Ok(0.)
                }
            }
            Value::Error(e) => Err(e),
        };
        if let Err(e) = _res {
            return CalcVertex::from_error(e);
        }
        let $var = _res.unwrap();
    };
}

macro_rules! assert_text_from_calc_value {
    ($var:ident, $value:expr) => {
        let _v = match $value {
            CalcValue::Scalar(v) => Some(v),
            _ => None,
        };
        if _v.is_none() {
            return CalcVertex::from_error(ast::Error::Num);
        }
        let _value = _v.unwrap();
        let _res = match _value {
            Value::Blank => Ok(String::from("")),
            Value::Number(n) => Ok($crate::calc_engine::calculator::number_text::number_to_text(n)),
            Value::Text(t) => Ok(t),
            Value::Boolean(b) => {
                if b {
                    Ok(String::from("TRUE"))
                } else {
                    Ok(String::from("FALSE"))
                }
            }
            Value::Error(e) => Err(e),
        };
        if let Err(e) = _res {
            return CalcVertex::from_error(e);
        }
        let $var = _res.unwrap();
    };
}

macro_rules! assert_bool_from_calc_value {
    ($var:ident, $value:expr) => {
        let _v = match $value {
            CalcValue::Scalar(v) => Some(v),
            _ => None,
        };
        if _v.is_none() {
            return CalcVertex::from_error(ast::Error::Num);
        }
        let _value = _v.unwrap();
        let _res = match _value {
            Value::Boolean(b) => Ok(b),
            _ => Err(ast::Error::Num),
        };
        if let Err(e) = _res {
            return CalcVertex::from_error(e);
        }
        let $var = _res.unwrap();
    };
}