use std::cell::RefCell;
use crate::prelude::{Getter, SetterMut, With, WithBuilder};
impl<Target, From> Getter<From> for Target
where
From: AsRef<Target>,
{
fn get(from: &From) -> &Target {
from.as_ref()
}
}
pub struct Builder<T: Default> {
pub inner: RefCell<Option<T>>,
}
impl<T: Default> Default for Builder<T> {
fn default() -> Self {
Self {
inner: RefCell::new(Some(Default::default())),
}
}
}
impl<T: Default> Builder<T> {
pub fn build(&self) -> Option<T> {
self.inner.borrow_mut().take()
}
}
impl<Param, Target> With<Param> for Builder<Target>
where
Target: Default + SetterMut<Param>,
{
fn with(self, param: Param) -> Self {
self.inner
.borrow_mut()
.as_mut()
.map(|val| SetterMut::<Param>::set(val, param));
self
}
}
impl<Target, Param> WithBuilder<Param> for Target
where
Builder<Target>: With<Param>,
Target: Default,
{
fn with(param: Param) -> Builder<Self> {
Builder::<Self>::default().with(param)
}
}