use std::sync::OnceLock;
use crate::component;
use crate::identity::Error;
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Purpose {
name: String,
bytes: Vec<u8>,
}
static REGISTRY: OnceLock<Vec<Purpose>> = OnceLock::new();
impl Purpose {
pub fn name(&self) -> &str {
&self.name
}
pub fn as_bytes(&self) -> &[u8] {
&self.bytes
}
pub fn registered() -> Result<&'static [Purpose], Error> {
if let Some(registry) = REGISTRY.get() {
return Ok(registry);
}
let (mut store, bindings) = component::load()?;
let listed = bindings
.aethel_core_identity()
.call_registered_purposes(&mut store)?;
let registry = listed
.into_iter()
.map(|p| Purpose {
name: p.name,
bytes: p.bytes,
})
.collect();
Ok(REGISTRY.get_or_init(|| registry))
}
pub fn from_name(name: &str) -> Result<Purpose, Error> {
Self::registered()?
.iter()
.find(|p| p.name == name)
.cloned()
.ok_or_else(|| Error::UnknownPurpose(name.to_string()))
}
}