use hurl_core::ast::SourceInfo;
use crate::runner::{Number, RunnerError, RunnerErrorKind, Value};
pub fn eval_count(
value: &Value,
source_info: SourceInfo,
assert: bool,
) -> Result<Option<Value>, RunnerError> {
match value {
Value::List(values) => Ok(Some(Value::Number(Number::Integer(values.len() as i64)))),
Value::Bytes(values) => Ok(Some(Value::Number(Number::Integer(values.len() as i64)))),
Value::Nodeset(size) => Ok(Some(Value::Number(Number::Integer(*size as i64)))),
v => {
let kind = RunnerErrorKind::FilterInvalidInputType {
actual: v.kind().to_string(),
expected: "list, bytes or nodeset".to_string(),
};
Err(RunnerError::new(source_info, kind, assert))
}
}
}
#[cfg(test)]
mod tests {
use hurl_core::ast::{Filter, FilterValue, SourceInfo};
use hurl_core::reader::Pos;
use super::*;
use crate::runner::VariableSet;
use crate::runner::filter::eval::eval_filter;
#[test]
fn eval_filter_count() {
let variables = VariableSet::new();
let filter = Filter {
source_info: SourceInfo::new(Pos::new(1, 1), Pos::new(1, 6)),
value: FilterValue::Count,
};
assert_eq!(
eval_filter(
&filter,
&Value::List(vec![
Value::Number(Number::Integer(1)),
Value::Number(Number::Integer(2)),
Value::Number(Number::Integer(2)),
]),
&variables,
false,
)
.unwrap()
.unwrap(),
Value::Number(Number::Integer(3))
);
let error = eval_filter(&filter, &Value::Bool(true), &variables, false)
.err()
.unwrap();
assert_eq!(
error.source_info,
SourceInfo::new(Pos::new(1, 1), Pos::new(1, 6))
);
assert_eq!(
error.kind,
RunnerErrorKind::FilterInvalidInputType {
actual: "boolean".to_string(),
expected: "list, bytes or nodeset".to_string()
}
);
}
}