use std::sync::OnceLock;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Tier {
Curated,
Example,
}
impl Tier {
pub fn as_str(self) -> &'static str {
match self {
Tier::Curated => "curated",
Tier::Example => "example",
}
}
}
#[derive(Debug)]
pub struct BundledWorkload {
pub name: &'static str,
pub tier: Tier,
pub source: &'static str,
}
static CATALOG: OnceLock<Vec<&'static BundledWorkload>> = OnceLock::new();
pub fn install(sets: &[&'static [BundledWorkload]]) {
let _ = CATALOG.set({
let mut all: Vec<&'static BundledWorkload> = sets.iter().flat_map(|s| s.iter()).collect();
all.sort_by_key(|w| w.name);
for pair in all.windows(2) {
assert_ne!(
pair[0].name, pair[1].name,
"bundled workload name collision across catalog sets: `{}`",
pair[0].name,
);
}
all
});
}
pub fn lookup(name: &str) -> Option<&'static BundledWorkload> {
CATALOG
.get()?
.binary_search_by_key(&name, |w| w.name)
.ok()
.map(|idx| CATALOG.get().unwrap()[idx])
}
pub fn iter() -> impl Iterator<Item = &'static BundledWorkload> {
CATALOG
.get()
.map(|v| v.as_slice())
.unwrap_or(&[])
.iter()
.copied()
}
pub fn iter_tier(tier: Tier) -> impl Iterator<Item = &'static BundledWorkload> {
iter().filter(move |w| w.tier == tier)
}
#[cfg(test)]
mod tests {
use super::*;
static SET_A: &[BundledWorkload] = &[
BundledWorkload {
name: "alpha",
tier: Tier::Curated,
source: "description: a\n",
},
BundledWorkload {
name: "examples/beta",
tier: Tier::Example,
source: "# b\n",
},
];
#[test]
fn install_lookup_and_tier_filter() {
install(&[SET_A]);
install(&[]);
assert!(lookup("alpha").is_some());
assert!(lookup("examples/beta").is_some());
assert!(lookup("nope").is_none());
let curated: Vec<_> = iter_tier(Tier::Curated).map(|w| w.name).collect();
assert_eq!(curated, vec!["alpha"]);
let all: Vec<_> = iter().map(|w| w.name).collect();
assert_eq!(all, vec!["alpha", "examples/beta"]);
}
}