featureflag 0.0.3

Runtime feature flagging for Rust
Documentation
#![allow(missing_docs)]

use featureflag::{
    Context, Evaluator, context, context::ContextRef, fields::Fields, set_global_default,
};

struct SomeEvaluator;

impl SomeEvaluator {
    fn new() -> Self {
        SomeEvaluator
    }
}

impl Evaluator for SomeEvaluator {
    fn is_enabled(&self, feature: &str, context: &Context) -> Option<bool> {
        match feature {
            "enabled" => Some(true),
            "disabled" => Some(false),
            "conditional" => context
                .iter()
                .find_map(|context| context.extensions().get::<Foo>())
                .map(|Foo(value)| *value),
            _ => None,
        }
    }

    fn on_new_context(&self, mut context: ContextRef<'_>, fields: Fields<'_>) {
        let foo_value = fields.get("foo").and_then(|value| value.as_bool());
        if let Some(foo_value) = foo_value {
            context.extensions_mut().insert(Foo(foo_value));
        }
    }
}

struct Foo(bool);

fn main() {
    set_global_default(SomeEvaluator::new());

    if featureflag::is_enabled!("enabled", false) {
        println!("feature \"enabled\" is enabled");
    } else {
        println!("feature \"enabled\" is not enabled");
    }

    if featureflag::is_enabled!("disabled", false) {
        println!("feature \"disabled\" is enabled");
    } else {
        println!("feature \"disabled\" is not enabled");
    }

    if featureflag::is_enabled!("unknown", false) {
        println!("feature \"unknown\" is enabled");
    } else {
        println!("feature \"unknown\" is not enabled");
    }

    if featureflag::is_enabled!("conditional", false) {
        println!("feature \"conditional\" is enabled outside of context");
    } else {
        println!("feature \"conditional\" is not enabled outside of context");
    }

    context!(foo = false).in_scope(|| {
        if featureflag::is_enabled!("conditional", false) {
            println!("feature \"conditional\" is enabled inside of non-foo context");
        } else {
            println!("feature \"conditional\" is not enabled inside of non-foo context");
        }
    });

    context!(foo = true).in_scope(|| {
        if featureflag::is_enabled!("conditional", false) {
            println!("feature \"conditional\" is enabled inside of foo context");
        } else {
            println!("feature \"conditional\" is not enabled inside of foo context");
        }

        context!().in_scope(|| {
            if featureflag::is_enabled!("conditional", false) {
                println!("feature \"conditional\" is enabled inside of nested context");
            } else {
                println!("feature \"conditional\" is not enabled inside of nested context");
            }
        });

        context!(foo = false).in_scope(|| {
            if featureflag::is_enabled!("conditional", false) {
                println!("feature \"conditional\" is enabled inside of nested non-foo context");
            } else {
                println!("feature \"conditional\" is not enabled inside of nested non-foo context");
            }
        });
    });
}