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