basic/
basic.rs

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}