1#![allow(missing_docs)]
2
3use featureflag::{
4 Context, Evaluator, context, context::ContextRef, fields::Fields, set_global_default,
5};
6
7struct SomeEvaluator;
8
9impl SomeEvaluator {
10 fn new() -> Self {
11 SomeEvaluator
12 }
13}
14
15impl Evaluator for SomeEvaluator {
16 fn is_enabled(&self, feature: &str, context: &Context) -> Option<bool> {
17 match feature {
18 "enabled" => Some(true),
19 "disabled" => Some(false),
20 "conditional" => context
21 .iter()
22 .find_map(|context| context.extensions().get::<Foo>())
23 .map(|Foo(value)| *value),
24 _ => None,
25 }
26 }
27
28 fn on_new_context(&self, mut context: ContextRef<'_>, fields: Fields<'_>) {
29 let foo_value = fields.get("foo").and_then(|value| value.as_bool());
30 if let Some(foo_value) = foo_value {
31 context.extensions_mut().insert(Foo(foo_value));
32 }
33 }
34}
35
36struct Foo(bool);
37
38fn main() {
39 set_global_default(SomeEvaluator::new());
40
41 if featureflag::is_enabled!("enabled", false) {
42 println!("feature \"enabled\" is enabled");
43 } else {
44 println!("feature \"enabled\" is not enabled");
45 }
46
47 if featureflag::is_enabled!("disabled", false) {
48 println!("feature \"disabled\" is enabled");
49 } else {
50 println!("feature \"disabled\" is not enabled");
51 }
52
53 if featureflag::is_enabled!("unknown", false) {
54 println!("feature \"unknown\" is enabled");
55 } else {
56 println!("feature \"unknown\" is not enabled");
57 }
58
59 if featureflag::is_enabled!("conditional", false) {
60 println!("feature \"conditional\" is enabled outside of context");
61 } else {
62 println!("feature \"conditional\" is not enabled outside of context");
63 }
64
65 context!(foo = false).in_scope(|| {
66 if featureflag::is_enabled!("conditional", false) {
67 println!("feature \"conditional\" is enabled inside of non-foo context");
68 } else {
69 println!("feature \"conditional\" is not enabled inside of non-foo context");
70 }
71 });
72
73 context!(foo = true).in_scope(|| {
74 if featureflag::is_enabled!("conditional", false) {
75 println!("feature \"conditional\" is enabled inside of foo context");
76 } else {
77 println!("feature \"conditional\" is not enabled inside of foo context");
78 }
79
80 context!().in_scope(|| {
81 if featureflag::is_enabled!("conditional", false) {
82 println!("feature \"conditional\" is enabled inside of nested context");
83 } else {
84 println!("feature \"conditional\" is not enabled inside of nested context");
85 }
86 });
87
88 context!(foo = false).in_scope(|| {
89 if featureflag::is_enabled!("conditional", false) {
90 println!("feature \"conditional\" is enabled inside of nested non-foo context");
91 } else {
92 println!("feature \"conditional\" is not enabled inside of nested non-foo context");
93 }
94 });
95 });
96}