Diffstat (limited to 'src/build.rs')
| -rw-r--r-- | src/build.rs | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/src/build.rs b/src/build.rs new file mode 100644 index 0000000..6342309 --- /dev/null +++ b/src/build.rs @@ -0,0 +1,61 @@ +use crate::{UniError, Visitor, WalkStatus, Walker}; + +/// A type buildable from a walker. +pub trait Build<'value, 'ctx: 'value, WalkerErr>: Sized { + type Error; + + /// The builder that can be used to build a value. + type Builder: Builder<'value, 'ctx, WalkerErr, Value = Self, Error = Self::Error>; +} + +// /// Build a [`Buildable`] type from a walker. +// /// +// /// This calls [`Walker::walk`] on the walker. +// pub fn build< +// 'value, +// 'ctx: 'value, +// T: Build<'value, 'ctx, W::Error, Error = VisitorErr>, +// VisitorErr, +// W: ?Sized + Walker<'value, 'ctx, VisitorErr>, +// >( +// walker: &mut W, +// ) -> Result<(T, WalkStatus), UniError<W::Error, VisitorErr>> { +// T::Builder::build(walker) +// } +// +// pub trait BuilderExt<'value, 'ctx: 'value, WalkerErr>: Builder<'value, 'ctx, WalkerErr> { +// fn build<W: ?Sized + Walker<'value, 'ctx, Self::Error, Error = WalkerErr>>( +// walker: &mut W, +// ) -> Result<(Self::Value, WalkStatus), UniError<WalkerErr, Self::Error>>; +// } +// +// impl<'value, 'ctx: 'value, WalkerErr, T: Builder<'value, 'ctx, WalkerErr>> BuilderExt<'value, 'ctx, WalkerErr> for T { +// fn build<W: ?Sized + Walker<'value, 'ctx, Self::Error, Error = WalkerErr>>( +// walker: &mut W, +// ) -> Result<(Self::Value, WalkStatus), UniError<WalkerErr, Self::Error>> { +// let mut builder = Self::init(); +// let status = walker.walk(builder.as_visitor())?; +// Ok((builder.finish()?, status)) +// } +// } + +/// Extension to [`Visitor`] that allows constructing and finishing the visitor. +pub trait Builder<'value, 'ctx: 'value, WalkerErr> { + type Error; + + /// Type to be built. + type Value: Sized; + + /// Init a new builder. + fn init() -> Self + where + Self: Sized; + + /// As a visitor. + fn as_visitor(&mut self) -> &mut dyn Visitor<'value, 'ctx, WalkerErr, Error = Self::Error>; + + /// Finish the value. + fn finish(self) -> Result<Self::Value, UniError<WalkerErr, Self::Error>> + where + Self: Sized; +} |