use hurl_core::ast::SourceInfo;
use crate::runner::{RunnerError, RunnerErrorKind, Value};
pub fn eval_last(
value: &Value,
source_info: SourceInfo,
assert: bool,
) -> Result<Option<Value>, RunnerError> {
match value {
Value::List(values) => match values.last().cloned() {
Some(last_value) => Ok(Some(last_value)),
None => {
let kind = RunnerErrorKind::FilterInvalidInputValue("list is empty".to_string());
Err(RunnerError::new(source_info, kind, assert))
}
},
v => {
let kind = RunnerErrorKind::FilterInvalidInputType {
actual: v.kind().to_string(),
expected: "list".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::filter::eval::eval_filter;
use crate::runner::{Number, VariableSet};
fn new_last_filter() -> Filter {
Filter {
source_info: SourceInfo::new(Pos::new(1, 1), Pos::new(1, 4)),
value: FilterValue::Last,
}
}
#[test]
fn eval_filter_last_ok() {
let variables = VariableSet::new();
let filter = new_last_filter();
let ret = eval_filter(
&filter,
&Value::List(vec![
Value::Number(Number::Integer(1)),
Value::Number(Number::Integer(3)),
Value::Number(Number::Integer(5)),
]),
&variables,
false,
);
assert_eq!(ret.unwrap().unwrap(), Value::Number(Number::Integer(5)));
}
#[test]
fn eval_filter_last_ko_empty_list() {
let variables = VariableSet::new();
let filter = new_last_filter();
let ret = eval_filter(&filter, &Value::List(vec![]), &variables, false);
assert_eq!(
ret.unwrap_err().kind,
RunnerErrorKind::FilterInvalidInputValue("list is empty".to_string())
);
}
#[test]
fn eval_filter_last_ko_invalid_input() {
let variables = VariableSet::new();
let filter = new_last_filter();
let ret = eval_filter(&filter, &Value::Bool(true), &variables, false);
assert_eq!(
ret.unwrap_err().kind,
RunnerErrorKind::FilterInvalidInputType {
actual: "boolean".to_string(),
expected: "list".to_string()
}
);
}
}