growthbook_rust/feature/
feature_rule_force.rs1use 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}