Skip to content

Commit a146bbb

Browse files
authored
Merge pull request #71 from FeatureProbe/fix_prerequisite
Fix prerequisite
2 parents e9d05ef + e321c5a commit a146bbb

File tree

5 files changed

+51
-32
lines changed

5 files changed

+51
-32
lines changed

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[package]
22
edition = "2021"
33
name = "feature-probe-server-sdk"
4-
version = "2.2.0"
4+
version = "2.3.0"
55
license = "Apache-2.0"
66
authors = ["[email protected]"]
77
description = "FeatureProbe Server Side SDK for Rust"

resources/fixtures/spec

src/evaluate.rs

Lines changed: 46 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -184,31 +184,22 @@ impl Toggle {
184184

185185
match self.do_eval(&eval_param, deep) {
186186
Ok(eval) => eval,
187-
Err(e) => self.default_variation(&eval_param, Some(e.to_string())),
187+
Err(e) => self.disabled_variation(&eval_param, Some(e.to_string())),
188188
}
189189
}
190190

191191
fn do_eval(
192192
&self,
193193
eval_param: &EvalParams,
194-
max_deep: u8,
194+
max_depth: u8,
195195
) -> Result<EvalDetail<Value>, PrerequisiteError> {
196196
if !self.enabled {
197-
let v = self.disabled_serve.select_variation(eval_param).ok();
198-
return Ok(self.serve_variation(
199-
v,
200-
"disabled".to_owned(),
201-
None,
202-
eval_param.debug_until_time,
203-
));
197+
return Ok(self.disabled_variation(eval_param, None))
204198
}
205199

206-
match self.check_prerequisites(eval_param, max_deep) {
207-
Ok(is_match) if !is_match => {
208-
return Ok(self.default_variation(eval_param, None));
209-
}
210-
Ok(_is_match) => {}
211-
Err(e) => return Err(e),
200+
if !self.meet_prerequisite(eval_param, max_depth)? {
201+
return Ok(self.disabled_variation(eval_param, Some(
202+
"Prerequisite not match".to_owned())));
212203
}
213204

214205
for (i, rule) in self.rules.iter().enumerate() {
@@ -237,13 +228,13 @@ impl Toggle {
237228
Ok(self.default_variation(eval_param, None))
238229
}
239230

240-
fn check_prerequisites(
231+
fn meet_prerequisite(
241232
&self,
242233
eval_param: &EvalParams,
243234
deep: u8,
244235
) -> Result<bool, PrerequisiteError> {
245236
if deep == 0 {
246-
return Err(PrerequisiteError::DeepOverflow);
237+
return Err(PrerequisiteError::DepthOverflow);
247238
}
248239

249240
if let Some(ref prerequisites) = self.prerequisites {
@@ -300,10 +291,38 @@ impl Toggle {
300291
eval_param: &EvalParams,
301292
reason: Option<String>,
302293
) -> EvalDetail<Value> {
303-
match self.default_serve.select_variation(eval_param) {
294+
return self.fixed_variation(
295+
&self.default_serve,
296+
eval_param,
297+
"default.".to_owned(),
298+
reason,
299+
);
300+
}
301+
302+
fn disabled_variation(
303+
&self,
304+
eval_param: &EvalParams,
305+
reason: Option<String>,
306+
) -> EvalDetail<Value> {
307+
return self.fixed_variation(
308+
&self.disabled_serve,
309+
eval_param,
310+
"disabled.".to_owned(),
311+
reason,
312+
);
313+
}
314+
315+
fn fixed_variation(
316+
&self,
317+
serve: &Serve,
318+
eval_param: &EvalParams,
319+
default_reason: String,
320+
reason: Option<String>,
321+
) -> EvalDetail<Value> {
322+
match serve.select_variation(eval_param) {
304323
Ok(v) => self.serve_variation(
305324
Some(v),
306-
concat_reason("default".to_owned(), reason),
325+
concat_reason(default_reason, reason),
307326
None,
308327
eval_param.debug_until_time,
309328
),
@@ -776,7 +795,7 @@ mod tests {
776795
}
777796

778797
#[test]
779-
fn test_prerequisite_not_exist() {
798+
fn test_prerequisite_not_exist_should_return_disabled_variation() {
780799
let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
781800
path.push("resources/fixtures/repo.json");
782801
let json_str = fs::read_to_string(path).unwrap();
@@ -789,12 +808,12 @@ mod tests {
789808
let toggle = repo.toggles.get("prerequisite_toggle_not_exist").unwrap();
790809
let r = toggle.eval(&user, &repo.segments, &repo.toggles, false, MAX_DEEP, None);
791810

792-
assert!(r.value.unwrap().as_object().unwrap().get("1").is_some());
811+
assert!(r.value.unwrap().as_object().unwrap().get("0").is_some());
793812
assert!(r.reason.contains("not exist"));
794813
}
795814

796815
#[test]
797-
fn test_prerequisite_not_match() {
816+
fn test_prerequisite_not_match_should_return_disabled_variation() {
798817
let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
799818
path.push("resources/fixtures/repo.json");
800819
let json_str = fs::read_to_string(path).unwrap();
@@ -807,12 +826,12 @@ mod tests {
807826
let toggle = repo.toggles.get("prerequisite_toggle_not_match").unwrap();
808827
let r = toggle.eval(&user, &repo.segments, &repo.toggles, false, MAX_DEEP, None);
809828

810-
assert!(r.value.unwrap().as_object().unwrap().get("1").is_some());
811-
assert!(r.reason.contains("default."));
829+
assert!(r.value.unwrap().as_object().unwrap().get("0").is_some());
830+
assert!(r.reason.contains("disabled."));
812831
}
813832

814833
#[test]
815-
fn test_prerequisite_max_deep() {
834+
fn test_prerequisite_depth_overflow_should_return_disabled_variation() {
816835
let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
817836
path.push("resources/fixtures/repo.json");
818837
let json_str = fs::read_to_string(path).unwrap();
@@ -825,8 +844,8 @@ mod tests {
825844
let toggle = repo.toggles.get("prerequisite_toggle").unwrap();
826845
let r = toggle.eval(&user, &repo.segments, &repo.toggles, false, 1, None);
827846

828-
assert!(r.value.unwrap().as_object().unwrap().get("1").is_some());
829-
assert!(r.reason.contains("deep overflow"));
847+
assert!(r.value.unwrap().as_object().unwrap().get("0").is_some());
848+
assert!(r.reason.contains("depth overflow"));
830849
}
831850

832851
fn gen_users(num: usize, random: bool) -> Vec<FPUser> {

src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,8 @@ pub enum FPError {
5252

5353
#[derive(Debug, Error)]
5454
enum PrerequisiteError {
55-
#[error("prerequisite deep overflow")]
56-
DeepOverflow,
55+
#[error("prerequisite depth overflow")]
56+
DepthOverflow,
5757
#[error("prerequisite not exist: {0}")]
5858
NotExist(String),
5959
}

0 commit comments

Comments
 (0)