Skip to content

Commit 7bf11d1

Browse files
committed
feat: segment
1 parent 9d32f77 commit 7bf11d1

File tree

4 files changed

+70
-11
lines changed

4 files changed

+70
-11
lines changed

resources/fixtures/repo.json

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@
5858
{
5959
"type": "segment",
6060
"subject": "user",
61-
"predicate": "in",
61+
"predicate": "is in",
6262
"objects": [
6363
"some_segment1-fjoaefjaam"
6464
]
@@ -108,7 +108,7 @@
108108
{
109109
"type": "segment",
110110
"subject": "user",
111-
"predicate": "in",
111+
"predicate": "is in",
112112
"objects": [
113113
"some_segment1-fjoaefjaam"
114114
]
@@ -158,7 +158,7 @@
158158
{
159159
"type": "segment",
160160
"subject": "user",
161-
"predicate": "in",
161+
"predicate": "is in",
162162
"objects": [
163163
"some_segment1-fjoaefjaam"
164164
]
@@ -230,7 +230,7 @@
230230
{
231231
"type": "segment",
232232
"subject": "user",
233-
"predicate": "in",
233+
"predicate": "is in",
234234
"objects": [
235235
"some_segment1-fjoaefjaam"
236236
]
@@ -336,6 +336,41 @@
336336
"disabled_key": "disabled_value"
337337
}
338338
]
339+
},
340+
"not_in_segment": {
341+
"key": "not_in_segment",
342+
"enabled": true,
343+
"forClient": false,
344+
"version": 1,
345+
"disabledServe": {
346+
"select": 0
347+
},
348+
"defaultServe": {
349+
"select": 0
350+
},
351+
"rules": [
352+
{
353+
"serve": {
354+
"select": 1
355+
},
356+
"conditions": [
357+
{
358+
"type": "segment",
359+
"subject": "user",
360+
"predicate": "is not in",
361+
"objects": [
362+
"some_segment1-fjoaefjaam"
363+
]
364+
}
365+
]
366+
}
367+
],
368+
"variations": [
369+
{},
370+
{
371+
"not_in": true
372+
}
373+
]
339374
}
340375
}
341376
}

resources/fixtures/segments.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
{
1111
"type": "string",
1212
"subject": "city",
13-
"predicate": "in",
13+
"predicate": "is in",
1414
"objects": [
1515
"4"
1616
]

resources/fixtures/toggles.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
{
4444
"type": "string",
4545
"subject": "city",
46-
"predicate": "in",
46+
"predicate": "is one of",
4747
"objects": [
4848
"1",
4949
"2",
@@ -60,7 +60,7 @@
6060
{
6161
"type": "segment",
6262
"subject": "user",
63-
"predicate": "in",
63+
"predicate": "is in",
6464
"object": ["some_segment1-fjoaefjaam"]
6565
}
6666
]
@@ -99,7 +99,7 @@
9999
{
100100
"type": "string",
101101
"subject": "city",
102-
"predicate": "in",
102+
"predicate": "is one of",
103103
"objects": [
104104
"1",
105105
"2",
@@ -109,7 +109,7 @@
109109
{
110110
"type": "string",
111111
"subject": "os",
112-
"predicate": "in",
112+
"predicate": "is one of",
113113
"objects": [
114114
"mac",
115115
"linux"

src/evalutate.rs

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -301,19 +301,26 @@ impl Condition {
301301
pub fn meet(&self, user: &FPUser, segment_repo: Option<&HashMap<String, Segment>>) -> bool {
302302
match &self.r#type {
303303
ConditionType::String => self.match_string_condition(user, &self.predicate),
304-
ConditionType::Segment => self.match_segment_condition(user, segment_repo),
304+
ConditionType::Segment => {
305+
self.match_segment_condition(user, &self.predicate, segment_repo)
306+
}
305307
_ => false,
306308
}
307309
}
308310

309311
fn match_segment_condition(
310312
&self,
311313
user: &FPUser,
314+
predicate: &str,
312315
segment_repo: Option<&HashMap<String, Segment>>,
313316
) -> bool {
314317
match segment_repo {
315318
None => false,
316-
Some(repo) => self.user_in_segments(user, repo),
319+
Some(repo) => match predicate {
320+
"is in" => self.user_in_segments(user, repo),
321+
"is not in" => !self.user_in_segments(user, repo),
322+
_ => false,
323+
},
317324
}
318325
}
319326

@@ -453,6 +460,23 @@ mod tests {
453460
assert!(r.get("variation_1").is_some());
454461
}
455462

463+
#[test]
464+
fn test_not_in_segment_condition() {
465+
let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
466+
path.push("resources/fixtures/repo.json");
467+
let json_str = fs::read_to_string(path).unwrap();
468+
let repo = load_json(&json_str);
469+
assert!(repo.is_ok());
470+
let repo = repo.unwrap();
471+
472+
let user = FPUser::new("key11").with("city", "100");
473+
let toggle = repo.toggles.get("not_in_segment").unwrap();
474+
let r = toggle.eval(&user, &repo.segments);
475+
let r = r.unwrap();
476+
let r = r.as_object().unwrap();
477+
assert!(r.get("not_in").is_some());
478+
}
479+
456480
#[test]
457481
fn test_multi_condition() {
458482
let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR"));

0 commit comments

Comments
 (0)