pub trait Builder {
type Result;
fn build(self) -> Self::Result;
}
pub trait Buildable: Sized
where
Self: guts::BoulderBase,
{
type Builder: Builder<Result = Self>;
fn builder() -> Self::Builder;
}
pub use boulder_derive::Buildable;
#[doc(hidden)]
pub mod guts {
use super::Buildable;
use std::cell::{Cell, RefCell};
use std::rc::Rc;
use std::sync::{Arc, Mutex};
pub use super::Builder as MiniBuilder;
pub trait MiniBuildable<T>: Sized {
type Builder: MiniBuilder<Result = Self>;
fn mini_builder() -> Self::Builder;
}
impl<T> Buildable for T
where
T: BoulderBase,
T: MiniBuildable<<T as BoulderBase>::Base>,
{
type Builder = <T as MiniBuildable<<T as BoulderBase>::Base>>::Builder;
fn builder() -> Self::Builder {
<T as MiniBuildable<<T as BoulderBase>::Base>>::mini_builder()
}
}
pub trait BoulderBase {
type Base;
}
impl<T> BoulderBase for Option<T>
where
T: BoulderBase,
{
type Base = <T as BoulderBase>::Base;
}
impl<T> BoulderBase for Arc<T>
where
T: BoulderBase,
{
type Base = <T as BoulderBase>::Base;
}
impl<T> BoulderBase for Rc<T>
where
T: BoulderBase,
{
type Base = <T as BoulderBase>::Base;
}
impl<T> BoulderBase for RefCell<T>
where
T: BoulderBase,
{
type Base = <T as BoulderBase>::Base;
}
impl<T> BoulderBase for Cell<T>
where
T: BoulderBase,
{
type Base = <T as BoulderBase>::Base;
}
impl<T> BoulderBase for Mutex<T>
where
T: BoulderBase,
{
type Base = <T as BoulderBase>::Base;
}
}