use crate::value::{Set, Value};
use super::evaluator::RbacBuiltinError;
pub(super) fn list_contains(left: &Value, right: &Value) -> Result<bool, RbacBuiltinError> {
match *left {
Value::Array(ref list) => Ok(list_contains_values(list.as_slice(), right)),
Value::Set(ref set) => Ok(set_contains_values(set, right)),
_ => Ok(false),
}
}
fn list_contains_values(list: &[Value], needle: &Value) -> bool {
match *needle {
Value::Array(ref right_list) => right_list.iter().all(|item| list.contains(item)),
Value::Set(ref right_set) => right_set.iter().all(|item| list.contains(item)),
_ => list.contains(needle),
}
}
fn set_contains_values(set: &Set, needle: &Value) -> bool {
match *needle {
Value::Array(ref right_list) => right_list.iter().all(|item| set.contains(item)),
Value::Set(ref right_set) => right_set.iter().all(|item| set.contains(item)),
_ => set.contains(needle),
}
}