use crate::error::{Error, ErrorKind};
use super::Builder;
#[doc(hidden)]
pub struct Configured<T> {
builder: std::sync::Mutex<Option<Builder<T>>>,
}
impl<T> Default for Configured<T> {
fn default() -> Self {
Self::new()
}
}
impl<T> Configured<T> {
#[must_use]
pub const fn new() -> Self {
Self {
builder: std::sync::Mutex::new(None),
}
}
pub fn set(&self, builder: Builder<T>) {
*self
.builder
.lock()
.unwrap_or_else(std::sync::PoisonError::into_inner) = Some(builder);
}
pub fn get(&self, name: &str) -> Result<Builder<T>, Error> {
self.builder
.lock()
.unwrap_or_else(std::sync::PoisonError::into_inner)
.clone()
.ok_or_else(|| {
Error::new(
ErrorKind::Backend,
format!(
"`{name}` has not been configured yet; build and \
install one first: `{name}::builder(\"..\")\
.file(..).init()?`"
),
)
})
}
}