pub const KNOWN_FEATURES: &[&str] = &[];
pub const STICKY_FEATURES: &[&str] = &[];
const fn const_str_eq(a: &str, b: &str) -> bool {
let a = a.as_bytes();
let b = b.as_bytes();
if a.len() != b.len() {
return false;
}
let mut i = 0;
while i < a.len() {
if a[i] != b[i] {
return false;
}
i += 1;
}
true
}
const fn const_slice_contains(haystack: &[&str], needle: &str) -> bool {
let mut i = 0;
while i < haystack.len() {
if const_str_eq(haystack[i], needle) {
return true;
}
i += 1;
}
false
}
const fn sticky_is_subset_of_known() -> bool {
let mut i = 0;
while i < STICKY_FEATURES.len() {
if !const_slice_contains(KNOWN_FEATURES, STICKY_FEATURES[i]) {
return false;
}
i += 1;
}
true
}
const _: () = assert!(
sticky_is_subset_of_known(),
"STICKY_FEATURES must be a subset of KNOWN_FEATURES",
);
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn const_str_eq_matches() {
assert!(const_str_eq("foo", "foo"));
assert!(!const_str_eq("foo", "bar"));
assert!(!const_str_eq("foo", "foobar"));
}
#[test]
fn const_slice_contains_matches() {
let s: &[&str] = &["a", "b", "c"];
assert!(const_slice_contains(s, "b"));
assert!(!const_slice_contains(s, "z"));
}
}