oai-statsig-rust 0.26.0

Statsig Rust SDK for usage in multi-user server environments.
Documentation
use crate::{
    evaluation::evaluator_value::MemoizedEvaluatorValue,
    specs_response::spec_types::ConditionOperator, unwrap_or_return,
    user::user_value::UserValueRef,
};
use std::collections::HashSet;

pub(crate) fn compare_arrays(
    value: UserValueRef<'_>,
    target_value: &MemoizedEvaluatorValue,
    op: ConditionOperator,
) -> bool {
    let target_array = unwrap_or_return!(&target_value.array_value, false);
    let value_len = unwrap_or_return!(value.array_len(), false);
    let value_set: HashSet<&str> = HashSet::from_iter((0..value_len).map(|index| {
        value
            .array_item(index)
            .and_then(UserValueRef::string_value)
            .unwrap_or_default()
    }));

    for (_, item) in target_array.values() {
        match op {
            ConditionOperator::ArrayContainsAll => {
                if !value_set.contains(item.as_str()) {
                    return false;
                }
            }
            ConditionOperator::ArrayContainsAny => {
                if value_set.contains(item.as_str()) {
                    return true;
                }
            }
            ConditionOperator::ArrayContainsNone => {
                if value_set.contains(item.as_str()) {
                    return false;
                }
            }
            ConditionOperator::NotArrayContainsAll => {
                if !value_set.contains(item.as_str()) {
                    return true;
                }
            }

            _ => {
                return false;
            }
        }
    }
    !matches!(
        op,
        ConditionOperator::ArrayContainsAny | ConditionOperator::NotArrayContainsAll
    )
}