Diffstat (limited to 'src/build.rs')
-rw-r--r--src/build.rs132
1 files changed, 70 insertions, 62 deletions
diff --git a/src/build.rs b/src/build.rs
index b17413a..ebea4ff 100644
--- a/src/build.rs
+++ b/src/build.rs
@@ -1,14 +1,14 @@
-pub mod builders;
+// pub mod builders;
use crate::{
- protocol::{SyncEffect, Visitor},
+ protocol::{AnyTraitSendObj as _, Effect, SyncEffect, Visitor},
Walker,
};
/// A buildable type.
-pub trait Build<'ctx>: Sized {
+pub trait Build<'ctx, E: Effect<'ctx>>: Sized {
/// The builder that can be used to build a value of `Self`.
- type Builder: Builder<'ctx, Value = Self>;
+ type Builder: Builder<'ctx, E, Value = Self>;
}
/// Builder for a type.
@@ -24,7 +24,7 @@ pub trait Build<'ctx>: Sized {
/// the builder with data from it's walk.
/// - Call [`Self::build()`] to finish building the value and get any errors
/// that happened during filling it with data.
-pub trait Builder<'ctx> {
+pub trait Builder<'ctx, E: Effect<'ctx>>: AsVisitor<'ctx, E> {
type Seed;
/// Error that can happen during filling the builder with data.
@@ -35,11 +35,6 @@ pub trait Builder<'ctx> {
fn from_seed(seed: Self::Seed) -> Self;
- /// Get the builder as a visitor that a walker can use.
- ///
- /// This is expected to just be `self`.
- fn as_visitor(&mut self) -> &mut Visitor<'_, 'ctx>;
-
/// Finish the value.
///
/// If an error happened with the builder during the walk
@@ -47,11 +42,18 @@ pub trait Builder<'ctx> {
fn build(self) -> Result<Self::Value, Self::Error>;
}
-pub trait DefaultBuilder<'ctx>: Builder<'ctx> {
+pub trait AsVisitor<'ctx, E: Effect<'ctx>> {
+ /// Get the builder as a visitor that a walker can use.
+ ///
+ /// This is expected to just be `self`.
+ fn as_visitor(&mut self) -> Visitor<'_, 'ctx, E>;
+}
+
+pub trait DefaultBuilder<'ctx, E: Effect<'ctx>>: Builder<'ctx, E> {
fn default() -> Self;
}
-impl<'ctx, B: Builder<'ctx>> DefaultBuilder<'ctx> for B
+impl<'ctx, B: Builder<'ctx, E>, E: Effect<'ctx>> DefaultBuilder<'ctx, E> for B
where
B::Seed: Default,
{
@@ -66,53 +68,59 @@ pub enum BuildError<B, W> {
Walker(W),
}
-#[inline]
-pub fn build<'ctx, T: Build<'ctx>, W: Walker<'ctx, Effect = SyncEffect>>(
- walker: W,
-) -> Result<T, BuildError<<<T as Build<'ctx>>::Builder as Builder<'ctx>>::Error, W::Error>>
-where
- <<T as Build<'ctx>>::Builder as Builder<'ctx>>::Seed: Default,
-{
- let mut builder = T::Builder::from_seed(Default::default());
-
- if let core::ops::ControlFlow::Break(err) = walker.walk(builder.as_visitor()) {
- return Err(BuildError::Walker(err));
- }
-
- builder.build().map_err(BuildError::Builder)
-}
-
-pub fn build_with<'ctx, B: Builder<'ctx>, W: Walker<'ctx, Effect = SyncEffect>>(
- walker: W,
-) -> Result<B::Value, BuildError<B::Error, W::Error>>
-where
- <B as Builder<'ctx>>::Seed: Default,
-{
- let mut builder = B::from_seed(Default::default());
-
- if let core::ops::ControlFlow::Break(err) = walker.walk(builder.as_visitor()) {
- return Err(BuildError::Walker(err));
- }
-
- builder.build().map_err(BuildError::Builder)
-}
-
-#[cfg(feature = "alloc")]
-use crate::protocol::AsyncEffect;
-
-#[cfg(feature = "alloc")]
-pub async fn async_build_with<
- 'ctx,
- B: DefaultBuilder<'ctx>,
- W: Walker<'ctx, Effect = AsyncEffect>,
->(
- walker: W,
-) -> Result<B::Value, BuildError<B::Error, W::Error>> {
- let mut builder = B::default();
-
- if let core::ops::ControlFlow::Break(err) = walker.walk(builder.as_visitor()).await {
- return Err(BuildError::Walker(err));
- }
-
- builder.build().map_err(BuildError::Builder)
-}
+// #[inline]
+// pub fn build<'ctx, T: Build<'ctx, SyncEffect>, W: for<'a> Walker<'a, 'ctx, Effect = SyncEffect>>(
+// walker: W,
+// ) -> Result<
+// T,
+// BuildError<
+// <<T as Build<'ctx, SyncEffect>>::Builder as Builder<'ctx, SyncEffect>>::Error,
+// W::Error,
+// >,
+// >
+// where
+// <<T as Build<'ctx, SyncEffect>>::Builder as Builder<'ctx, SyncEffect>>::Seed: Default,
+// {
+// let mut builder = T::Builder::from_seed(Default::default());
+//
+// if let core::ops::ControlFlow::Break(err) = walker.walk(builder.as_visitor().as_obj_mut()) {
+// return Err(BuildError::Walker(err));
+// }
+//
+// builder.build().map_err(BuildError::Builder)
+// }
+//
+// pub fn build_with<'ctx, B: Builder<'ctx, SyncEffect>, W: for<'a> Walker<'a, 'ctx, Effect = SyncEffect>>(
+// walker: W,
+// ) -> Result<B::Value, BuildError<B::Error, W::Error>>
+// where
+// <B as Builder<'ctx, SyncEffect>>::Seed: Default,
+// {
+// let mut builder = B::from_seed(Default::default());
+//
+// if let core::ops::ControlFlow::Break(err) = walker.walk(builder.as_visitor().as_obj_mut()) {
+// return Err(BuildError::Walker(err));
+// }
+//
+// builder.build().map_err(BuildError::Builder)
+// }
+
+// #[cfg(feature = "alloc")]
+// use crate::protocol::AsyncEffect;
+//
+// #[cfg(feature = "alloc")]
+// pub async fn async_build_with<
+// 'ctx,
+// B: DefaultBuilder<'ctx, AsyncEffect>,
+// W: for<'a> Walker<'a, 'ctx, Effect = AsyncEffect>,
+// >(
+// walker: W,
+// ) -> Result<B::Value, BuildError<B::Error, W::Error>> {
+// let mut builder = B::default();
+//
+// if let core::ops::ControlFlow::Break(err) = walker.walk(builder.as_visitor()).await {
+// return Err(BuildError::Walker(err));
+// }
+//
+// builder.build().map_err(BuildError::Builder)
+// }