Diffstat (limited to 'src/build/builders/core/bool.rs')
| -rw-r--r-- | src/build/builders/core/bool.rs | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/src/build/builders/core/bool.rs b/src/build/builders/core/bool.rs new file mode 100644 index 0000000..dd98d0e --- /dev/null +++ b/src/build/builders/core/bool.rs @@ -0,0 +1,54 @@ +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(()) + }) + } +} |