growthbook_rust/feature/
feature_rule_force.rs

1use crate::condition::use_case::ConditionsMatchesAttributes;
2use crate::coverage::model::Coverage;
3use crate::dto::GrowthBookFeatureRuleForce;
4use crate::extensions::FindGrowthBookAttribute;
5use crate::filter::use_case::Filter;
6use crate::model_public::{FeatureResult, GrowthBookAttribute};
7
8impl GrowthBookFeatureRuleForce {
9    pub fn get_match_value(
10        &self,
11        feature_name: &str,
12        user_attributes: &Vec<GrowthBookAttribute>,
13    ) -> Option<FeatureResult> {
14        if let Some(filters) = &self.filters {
15            let hash_attribute = self.get_fallback_attribute();
16            if Filter::is_filtered_out(filters, &hash_attribute, user_attributes) {
17                return None;
18            }
19        }
20
21        if let Some(feature_attributes) = self.conditions() {
22            if feature_attributes.matches(user_attributes) {
23                self.check_range_or_force(feature_name, user_attributes)
24            } else {
25                None
26            }
27        } else {
28            self.check_range_or_force(feature_name, user_attributes)
29        }
30    }
31
32    fn check_range_or_force(
33        &self,
34        feature_name: &str,
35        user_attributes: &Vec<GrowthBookAttribute>,
36    ) -> Option<FeatureResult> {
37        if let Some(range) = self.range() {
38            let fallback_attribute = self.get_fallback_attribute();
39            if let Some(user_value) = user_attributes.find_value(&fallback_attribute) {
40                let seed = self.seed.clone().unwrap_or(feature_name.to_string());
41                Coverage::check(&user_value, None, Some(range), &seed, self.hash_version, self.force.clone())
42            } else {
43                None
44            }
45        } else {
46            Some(FeatureResult::force(self.force.clone()))
47        }
48    }
49}