Diffstat (limited to 'src/build.rs')
| -rw-r--r-- | src/build.rs | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/src/build.rs b/src/build.rs index 0d103ce..87c0fc8 100644 --- a/src/build.rs +++ b/src/build.rs @@ -1,5 +1,4 @@ -// pub mod builders; -// pub mod protocols; +pub mod builders; use crate::{ protocol::{SyncEffect, Visitor}, @@ -35,7 +34,7 @@ pub trait Builder<'ctx>: Default { /// 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>; + fn as_visitor(&mut self) -> &mut Visitor<'_, 'ctx>; /// Finish the value. /// @@ -50,12 +49,25 @@ 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>> { + let mut builder = T::Builder::default(); + + if let core::ops::ControlFlow::Break(err) = walker.walk(builder.as_visitor()).into_inner() { + 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>> { let mut builder = B::default(); - if let core::ops::ControlFlow::Break(err) = walker.walk(builder.as_visitor()) { + if let core::ops::ControlFlow::Break(err) = walker.walk(builder.as_visitor()).into_inner() { return Err(BuildError::Walker(err)); } |