feature-flag 0.1.0

Server-side feature flag evaluation for async Rust: targeting rules, sticky percentage rollouts, hot reload, zero RNG.
Documentation
//! Tight micro-bench for the evaluator hot path: predicate match + rollout
//! bucketing. Run with `cargo bench`.

use std::time::Duration;

use criterion::{criterion_group, criterion_main, Criterion};
use feature_flag::{FlagEvaluator, FlagSet, Subject};

const SET: &str = r#"{
  "flags": [{
    "id": "f",
    "variants": ["control", "treatment"],
    "default_variant": "control",
    "rules": [{
      "id": "rollout",
      "when": {"kind": "compare", "attr": "country", "op": "in", "value": ["US", "CA"]},
      "outcome": {
        "kind": "rollout",
        "variants": [
          {"variant": "control", "weight": 70},
          {"variant": "treatment", "weight": 30}
        ]
      }
    }]
  }]
}"#;

fn bench_evaluate(c: &mut Criterion) {
    let evaluator = FlagEvaluator::new(FlagSet::from_json(SET).unwrap());
    let subject = Subject::new("user-1").with_attr("country", "US");

    c.bench_function("evaluate_rule_match_rollout", |b| {
        b.iter(|| {
            let _ = evaluator.evaluate("f", &subject).unwrap();
        });
    });
}

criterion_group! {
    name = benches;
    config = Criterion::default().sample_size(50).measurement_time(Duration::from_secs(3));
    targets = bench_evaluate
}
criterion_main!(benches);