Diffstat (limited to 'src/transform.rs')
-rw-r--r--src/transform.rs97
1 files changed, 30 insertions, 67 deletions
diff --git a/src/transform.rs b/src/transform.rs
index bb2efcf..2999ad7 100644
--- a/src/transform.rs
+++ b/src/transform.rs
@@ -1,86 +1,49 @@
use crate::{
build::{Build, Builder},
- walk::{Walk, WalkMut, WalkOnce},
- UniError, Walker,
+ walk::{WalkOnce, WalkMut, Walk},
};
-pub fn from<'value, 'ctx, U, T>(
- value: T,
-) -> Result<U, UniError<<T as WalkOnce<'value, 'ctx>>::Error, <U as Build<'value, 'ctx>>::Error>>
-where
- U: Build<'value, 'ctx>,
- <U as Build<'value, 'ctx>>::Error: 'value,
- T: WalkOnce<'value, 'ctx>,
- <T as WalkOnce<'value, 'ctx>>::Error: 'value,
-{
- build_from::<U::Builder, _>(value)
-}
-
-pub fn from_mut<'borrow, 'value, 'ctx, U, T: ?Sized>(
- value: &'borrow mut T,
-) -> Result<
- U,
- UniError<<T as WalkMut<'value, 'borrow, 'ctx>>::Error, <U as Build<'value, 'ctx>>::Error>,
->
-where
- U: Build<'value, 'ctx>,
- <U as Build<'value, 'ctx>>::Error: 'value,
- T: WalkMut<'value, 'borrow, 'ctx>,
- <T as WalkMut<'value, 'borrow, 'ctx>>::Error: 'value,
-{
- build_from_mut::<U::Builder, _>(value)
-}
+#[derive(thiserror::Error, Debug)]
+pub enum Either<A, B> {
+ #[error(transparent)]
+ A(A),
-pub fn from_ref<'borrow, 'value, 'ctx, U, T: ?Sized>(
- value: &'borrow T,
-) -> Result<U, UniError<<T as Walk<'value, 'borrow, 'ctx>>::Error, <U as Build<'value, 'ctx>>::Error>>
-where
- U: Build<'value, 'ctx>,
- <U as Build<'value, 'ctx>>::Error: 'value,
- T: Walk<'value, 'borrow, 'ctx>,
- <T as Walk<'value, 'borrow, 'ctx>>::Error: 'value,
-{
- build_from_ref::<U::Builder, _>(value)
+ #[error(transparent)]
+ B(B),
}
-pub fn build_from<'value, 'ctx, B, T>(
+pub fn from<'ctx, U, T>(
value: T,
-) -> Result<B::Value, UniError<<T as WalkOnce<'value, 'ctx>>::Error, B::Error>>
+) -> Result<U, Either<T::Error, <U::Builder as Builder<'ctx>>::Error>>
where
- B: Builder<'value, 'ctx>,
- <B as Builder<'value, 'ctx>>::Error: 'value,
- T: WalkOnce<'value, 'ctx>,
- <T as WalkOnce<'value, 'ctx>>::Error: 'value,
+ T: WalkOnce<'ctx>,
+ U: Build<'ctx>,
{
- let mut builder = B::init();
- value.into_walker().walk(builder.as_visitor())?;
- builder.finish().map_err(UniError::Visitor)
+ let mut builder = U::Builder::default();
+ value.walk_once(builder.as_visitor()).map_err(Either::A)?;
+ builder.build().map_err(Either::B)
}
-pub fn build_from_mut<'borrow, 'value, 'ctx, B, T: ?Sized>(
- value: &'borrow mut T,
-) -> Result<B::Value, UniError<<T as WalkMut<'value, 'borrow, 'ctx>>::Error, B::Error>>
+pub fn from_mut<'a, 'ctx, U, T>(
+ value: &'a mut T,
+) -> Result<U, Either<T::Error, <U::Builder as Builder<'ctx>>::Error>>
where
- B: Builder<'value, 'ctx>,
- <B as Builder<'value, 'ctx>>::Error: 'value,
- T: WalkMut<'value, 'borrow, 'ctx>,
- <T as WalkMut<'value, 'borrow, 'ctx>>::Error: 'value,
+ T: WalkMut<'a, 'ctx>,
+ U: Build<'ctx>,
{
- let mut builder = B::init();
- value.walker_mut().walk(builder.as_visitor())?;
- builder.finish().map_err(UniError::Visitor)
+ let mut builder = U::Builder::default();
+ value.walk_mut(builder.as_visitor()).map_err(Either::A)?;
+ builder.build().map_err(Either::B)
}
-pub fn build_from_ref<'borrow, 'value, 'ctx, B, T: ?Sized>(
- value: &'borrow T,
-) -> Result<B::Value, UniError<<T as Walk<'value, 'borrow, 'ctx>>::Error, B::Error>>
+pub fn from_ref<'a, 'ctx, U, T>(
+ value: &'a T,
+) -> Result<U, Either<T::Error, <U::Builder as Builder<'ctx>>::Error>>
where
- B: Builder<'value, 'ctx>,
- <B as Builder<'value, 'ctx>>::Error: 'value,
- T: Walk<'value, 'borrow, 'ctx>,
- <T as Walk<'value, 'borrow, 'ctx>>::Error: 'value,
+ T: Walk<'a, 'ctx>,
+ U: Build<'ctx>,
{
- let mut builder = B::init();
- value.walker().walk(builder.as_visitor())?;
- builder.finish().map_err(UniError::Visitor)
+ let mut builder = U::Builder::default();
+ value.walk(builder.as_visitor()).map_err(Either::A)?;
+ builder.build().map_err(Either::B)
}