use core::ops::ControlFlow;
use crate::{
any::static_wrapper::OwnedStatic,
any_trait,
protocol::{visitor::Value, ControlFlowFor, Effect},
};
impl<'ctx> crate::Build<'ctx> for bool {
type Builder = Builder;
}
#[derive(Debug)]
pub enum Error {
Incomplete,
}
pub struct Builder(Option<bool>);
impl<'ctx> Default for Builder {
fn default() -> Self {
Self(None)
}
}
impl<'ctx> crate::Builder<'ctx> for Builder {
type Error = Error;
type Value = bool;
fn as_visitor(&mut self) -> &mut crate::protocol::Visitor<'_, 'ctx> {
self
}
fn build(self) -> Result<Self::Value, Self::Error> {
self.0.ok_or(Error::Incomplete)
}
}
any_trait! {
impl['a, 'ctx] Builder = [
dyn Value<'a, OwnedStatic<bool>> + 'a,
];
}
impl<'a, E: Effect> Value<'a, OwnedStatic<bool>, E> for Builder {
#[inline]
fn visit(&'a mut self, OwnedStatic(value): OwnedStatic<bool>) -> ControlFlowFor<'a, E> {
E::wrap(async move {
self.0 = Some(value);
ControlFlow::Continue(())
})
}
}