use serde::Serialize;
use super::value::CellValue;
#[derive(Debug, Clone, PartialEq, Serialize, schemars::JsonSchema)]
pub enum EvalValue {
Scalar(CellValue),
Range(Vec<Vec<CellValue>>),
}
impl EvalValue {
pub fn as_scalar(&self) -> Option<&CellValue> {
match self {
EvalValue::Scalar(cv) => Some(cv),
EvalValue::Range(_) => None,
}
}
pub fn as_range(&self) -> Option<&Vec<Vec<CellValue>>> {
match self {
EvalValue::Range(rows) => Some(rows),
EvalValue::Scalar(_) => None,
}
}
pub fn scalar(cv: CellValue) -> EvalValue {
EvalValue::Scalar(cv)
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::excel_error::ExcelError;
#[test]
fn scalar_helper_and_as_scalar_round_trip() {
let v = EvalValue::scalar(CellValue::Number(42.0));
assert_eq!(v.as_scalar(), Some(&CellValue::Number(42.0)));
assert_eq!(v.as_range(), None);
}
#[test]
fn as_range_returns_the_rows() {
let rows = vec![
vec![CellValue::Number(1.0), CellValue::Number(2.0)],
vec![CellValue::Number(3.0), CellValue::Number(4.0)],
];
let v = EvalValue::Range(rows.clone());
assert_eq!(v.as_range(), Some(&rows));
assert_eq!(v.as_scalar(), None);
}
#[test]
fn scalar_can_carry_an_error() {
let v = EvalValue::Scalar(CellValue::Error(ExcelError::Na));
assert_eq!(v.as_scalar(), Some(&CellValue::Error(ExcelError::Na)));
}
#[test]
fn serializes_externally_tagged() {
let v = EvalValue::Scalar(CellValue::Number(238.728));
let j = serde_json::to_value(&v).unwrap();
assert_eq!(j["Scalar"]["Number"], 238.728);
}
}