use helios_fhirpath_support::{EvaluationError, EvaluationResult};
pub fn all_true_function(
invocation_base: &EvaluationResult,
) -> Result<EvaluationResult, EvaluationError> {
let items = match invocation_base {
EvaluationResult::Collection { items, .. } => items.clone(),
EvaluationResult::Empty => vec![],
single_item => vec![single_item.clone()],
};
if items.is_empty() {
return Ok(EvaluationResult::boolean(true));
}
for item in items {
match item {
EvaluationResult::Boolean(true, _, _) => continue,
EvaluationResult::Boolean(false, _, _) | EvaluationResult::Empty => {
return Ok(EvaluationResult::boolean(false));
}
_ => {
return Err(EvaluationError::TypeError(
"allTrue expects a collection of Booleans".to_string(),
));
}
}
}
Ok(EvaluationResult::boolean(true))
}
pub fn any_true_function(
invocation_base: &EvaluationResult,
) -> Result<EvaluationResult, EvaluationError> {
let items = match invocation_base {
EvaluationResult::Collection { items, .. } => items.clone(),
EvaluationResult::Empty => vec![],
single_item => vec![single_item.clone()],
};
if items.is_empty() {
return Ok(EvaluationResult::boolean(false));
}
for item in items {
match item {
EvaluationResult::Boolean(true, _, _) => return Ok(EvaluationResult::boolean(true)),
EvaluationResult::Boolean(false, _, _) | EvaluationResult::Empty => continue,
_ => {
return Err(EvaluationError::TypeError(
"anyTrue expects a collection of Booleans".to_string(),
));
}
}
}
Ok(EvaluationResult::boolean(false))
}
pub fn all_false_function(
invocation_base: &EvaluationResult,
) -> Result<EvaluationResult, EvaluationError> {
let items = match invocation_base {
EvaluationResult::Collection { items, .. } => items.clone(),
EvaluationResult::Empty => vec![],
single_item => vec![single_item.clone()],
};
if items.is_empty() {
return Ok(EvaluationResult::boolean(true));
}
for item in items {
match item {
EvaluationResult::Boolean(false, _, _) => continue,
EvaluationResult::Boolean(true, _, _) | EvaluationResult::Empty => {
return Ok(EvaluationResult::boolean(false));
}
_ => {
return Err(EvaluationError::TypeError(
"allFalse expects a collection of Booleans".to_string(),
));
}
}
}
Ok(EvaluationResult::boolean(true))
}
pub fn any_false_function(
invocation_base: &EvaluationResult,
) -> Result<EvaluationResult, EvaluationError> {
let items = match invocation_base {
EvaluationResult::Collection { items, .. } => items.clone(),
EvaluationResult::Empty => vec![],
single_item => vec![single_item.clone()],
};
if items.is_empty() {
return Ok(EvaluationResult::boolean(false));
}
for item in items {
match item {
EvaluationResult::Boolean(false, _, _) => return Ok(EvaluationResult::boolean(true)),
EvaluationResult::Boolean(true, _, _) | EvaluationResult::Empty => continue,
_ => {
return Err(EvaluationError::TypeError(
"anyFalse expects a collection of Booleans".to_string(),
));
}
}
}
Ok(EvaluationResult::boolean(false))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_all_true_empty_collection() {
let empty = EvaluationResult::Empty;
let result = all_true_function(&empty).unwrap();
assert_eq!(result, EvaluationResult::boolean(true));
}
#[test]
fn test_all_true_all_true_items() {
let collection = EvaluationResult::Collection {
items: vec![
EvaluationResult::boolean(true),
EvaluationResult::boolean(true),
EvaluationResult::boolean(true),
],
has_undefined_order: false,
type_info: None,
};
let result = all_true_function(&collection).unwrap();
assert_eq!(result, EvaluationResult::boolean(true));
}
#[test]
fn test_all_true_some_false_items() {
let collection = EvaluationResult::Collection {
items: vec![
EvaluationResult::boolean(true),
EvaluationResult::boolean(false),
EvaluationResult::boolean(true),
],
has_undefined_order: false,
type_info: None,
};
let result = all_true_function(&collection).unwrap();
assert_eq!(result, EvaluationResult::boolean(false));
}
#[test]
fn test_all_true_non_boolean_items() {
let collection = EvaluationResult::Collection {
items: vec![
EvaluationResult::boolean(true),
EvaluationResult::integer(42),
EvaluationResult::boolean(true),
],
has_undefined_order: false,
type_info: None,
};
let result = all_true_function(&collection);
assert!(result.is_err());
}
#[test]
fn test_any_true_empty_collection() {
let empty = EvaluationResult::Empty;
let result = any_true_function(&empty).unwrap();
assert_eq!(result, EvaluationResult::boolean(false));
}
#[test]
fn test_any_true_some_true_items() {
let collection = EvaluationResult::Collection {
items: vec![
EvaluationResult::boolean(false),
EvaluationResult::boolean(true),
EvaluationResult::boolean(false),
],
has_undefined_order: false,
type_info: None,
};
let result = any_true_function(&collection).unwrap();
assert_eq!(result, EvaluationResult::boolean(true));
}
#[test]
fn test_any_true_no_true_items() {
let collection = EvaluationResult::Collection {
items: vec![
EvaluationResult::boolean(false),
EvaluationResult::boolean(false),
EvaluationResult::boolean(false),
],
has_undefined_order: false,
type_info: None,
};
let result = any_true_function(&collection).unwrap();
assert_eq!(result, EvaluationResult::boolean(false));
}
#[test]
fn test_all_false_empty_collection() {
let empty = EvaluationResult::Empty;
let result = all_false_function(&empty).unwrap();
assert_eq!(result, EvaluationResult::boolean(true));
}
#[test]
fn test_all_false_all_false_items() {
let collection = EvaluationResult::Collection {
items: vec![
EvaluationResult::boolean(false),
EvaluationResult::boolean(false),
EvaluationResult::boolean(false),
],
has_undefined_order: false,
type_info: None,
};
let result = all_false_function(&collection).unwrap();
assert_eq!(result, EvaluationResult::boolean(true));
}
#[test]
fn test_all_false_some_true_items() {
let collection = EvaluationResult::Collection {
items: vec![
EvaluationResult::boolean(false),
EvaluationResult::boolean(true),
EvaluationResult::boolean(false),
],
has_undefined_order: false,
type_info: None,
};
let result = all_false_function(&collection).unwrap();
assert_eq!(result, EvaluationResult::boolean(false));
}
#[test]
fn test_any_false_empty_collection() {
let empty = EvaluationResult::Empty;
let result = any_false_function(&empty).unwrap();
assert_eq!(result, EvaluationResult::boolean(false));
}
#[test]
fn test_any_false_some_false_items() {
let collection = EvaluationResult::Collection {
items: vec![
EvaluationResult::boolean(true),
EvaluationResult::boolean(false),
EvaluationResult::boolean(true),
],
has_undefined_order: false,
type_info: None,
};
let result = any_false_function(&collection).unwrap();
assert_eq!(result, EvaluationResult::boolean(true));
}
#[test]
fn test_any_false_no_false_items() {
let collection = EvaluationResult::Collection {
items: vec![
EvaluationResult::boolean(true),
EvaluationResult::boolean(true),
EvaluationResult::boolean(true),
],
has_undefined_order: false,
type_info: None,
};
let result = any_false_function(&collection).unwrap();
assert_eq!(result, EvaluationResult::boolean(false));
}
}