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