use std::sync::OnceLock;
use inventory::iter;
use crate::ValueCodecRegistry;
use crate::ValueCodecRegistryError;
use crate::ValueStringCodecDescriptor;
use crate::ValueStringCodecRegistrationFactory;
pub type ValueStringCodecRegistry = ValueCodecRegistry<ValueStringCodecDescriptor>;
impl ValueStringCodecRegistry {
pub fn try_global() -> Result<&'static Self, ValueCodecRegistryError> {
static REGISTRY: OnceLock<Result<ValueStringCodecRegistry, ValueCodecRegistryError>> = OnceLock::new();
match REGISTRY.get_or_init(|| {
let registrations = iter::<ValueStringCodecRegistrationFactory>
.into_iter()
.map(|factory| (factory.0)())
.collect();
ValueCodecRegistry::build(registrations)
}) {
Ok(registry) => Ok(registry),
Err(error) => Err(error.clone()),
}
}
#[must_use]
#[inline]
pub fn global() -> &'static Self {
Self::try_global().unwrap_or_else(|error| panic!("invalid global value string codec registry: {error}"))
}
}