use std::env;
const LEVELS: [&str; 5] = ["ALPHA", "BETA", "GAMMA", "DELTA", "EPSILON"];
const RESERVED_LEVEL: &str = "RESERVED";
fn all_levels() -> impl Iterator<Item = &'static str> {
LEVELS
.iter()
.copied()
.chain(std::iter::once(RESERVED_LEVEL))
}
fn count_stability_cfgs() -> usize {
let mut count = 0;
for level in all_levels() {
let var = format!("CARGO_CFG_COMMONWARE_STABILITY_{}", level);
if env::var_os(var).is_some() {
count += 1;
}
}
if count > 0 {
return count;
}
let rustflags = env::var("RUSTFLAGS").unwrap_or_default();
for level in all_levels() {
let cfg = format!("commonware_stability_{}", level);
if rustflags.contains(&cfg) {
count += 1;
}
}
if count > 0 {
return count;
}
let encoded = env::var("CARGO_ENCODED_RUSTFLAGS").unwrap_or_default();
for level in all_levels() {
let cfg = format!("commonware_stability_{}", level);
if encoded.split('\u{1f}').any(|flag| flag.contains(&cfg)) {
count += 1;
}
}
count
}
fn main() {
println!("cargo:rerun-if-env-changed=RUSTFLAGS");
println!("cargo:rerun-if-env-changed=CARGO_ENCODED_RUSTFLAGS");
println!("cargo:rerun-if-env-changed=PROFILE");
let profile = env::var("PROFILE").unwrap_or_default();
let is_dev_profile = matches!(profile.as_str(), "debug" | "test");
let count = count_stability_cfgs();
if count == 0 && !is_dev_profile {
println!(
"cargo:warning=stability cfg not set; set RUSTFLAGS=\"--cfg commonware_stability_X\" (ALPHA/BETA/GAMMA/DELTA/EPSILON) to enforce stability gating"
);
} else if count > 1 {
println!(
"cargo:warning=multiple stability cfgs detected; only one stability level (ALPHA/BETA/GAMMA/DELTA/EPSILON) should be set at a time"
);
}
}