use super::registries::BUILTIN_REGISTRIES;
use crate::types::BuiltinRegistry;
pub fn load_all() -> Vec<BuiltinRegistry> {
BUILTIN_REGISTRIES
.iter()
.filter_map(|(handle, raw)| {
serde_yaml::from_str::<BuiltinRegistry>(raw)
.ok()
.or_else(|| {
eprintln!(
"Warning: failed to parse built-in registry '{handle}'"
);
None
})
})
.collect()
}
pub fn get(handle: &str) -> Option<BuiltinRegistry> {
load_all().into_iter().find(|r| r.handle == handle)
}
pub fn get_set() -> anyhow::Result<Option<BuiltinRegistry>> {
let set: Vec<BuiltinRegistry> =
load_all().into_iter().filter(|r| r.set).collect();
match set.len() {
0 => Ok(None),
1 => Ok(Some(set.into_iter().next().expect("length checked"))),
_ => Err(anyhow::anyhow!(
"More than one built-in registry is marked as the set registry \
({}). Only one registry can be the official set registry. Please \
fix the built-in registries definitions.",
set.iter()
.map(|r| r.handle.as_str())
.collect::<Vec<_>>()
.join(", ")
))
}
}