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