Diffstat (limited to 'src/build/builders/core/bool.rs')
-rw-r--r--src/build/builders/core/bool.rs54
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(())
+ })
+ }
+}