growthbook_rust/feature/
feature_rule_rollout.rs

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