use alloc::sync::Arc;
use core::any::Any;
use core::fmt;
use crate::id::{ArtifactDomain, Seed};
use uselesskey_core_factory::Factory as CoreFactory;
#[derive(Clone)]
pub struct Factory {
inner: CoreFactory,
}
pub use uselesskey_core_factory::Mode;
impl fmt::Debug for Factory {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.inner.fmt(f)
}
}
impl Factory {
pub fn new(mode: Mode) -> Self {
Self {
inner: CoreFactory::new(mode),
}
}
pub fn random() -> Self {
Self::new(Mode::Random)
}
pub fn deterministic(master: Seed) -> Self {
Self::new(Mode::Deterministic { master })
}
pub fn deterministic_from_str(text: &str) -> Self {
Self::deterministic(Seed::from_text(text))
}
#[cfg(feature = "std")]
pub fn deterministic_from_env(var: &str) -> Result<Self, crate::Error> {
let raw = std::env::var(var).map_err(|_| crate::Error::MissingEnvVar {
var: var.to_string(),
})?;
let seed = Seed::from_env_value(&raw).map_err(|message| crate::Error::InvalidSeed {
var: var.to_string(),
message,
})?;
Ok(Self::deterministic(seed))
}
pub fn mode(&self) -> &Mode {
self.inner.mode()
}
pub fn clear_cache(&self) {
self.inner.clear_cache()
}
pub fn get_or_init<T, F>(
&self,
domain: ArtifactDomain,
label: &str,
spec_bytes: &[u8],
variant: &str,
init: F,
) -> Arc<T>
where
T: Any + Send + Sync + 'static,
F: FnOnce(Seed) -> T,
{
self.inner
.get_or_init(domain, label, spec_bytes, variant, init)
}
}