use crate::{
build::{Build, Builder},
walk::{Walk, WalkMut, WalkOnce},
UniError, Walker,
};
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)
}
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)
}
pub fn build_from<'value, 'ctx, B, T>(
value: T,
) -> Result<B::Value, UniError<<T as WalkOnce<'value, 'ctx>>::Error, B::Error>>
where
B: Builder<'value, 'ctx>,
<B as Builder<'value, 'ctx>>::Error: 'value,
T: WalkOnce<'value, 'ctx>,
<T as WalkOnce<'value, 'ctx>>::Error: 'value,
{
let mut builder = B::init();
value.into_walker().walk(builder.as_visitor())?;
builder.finish().map_err(UniError::Visitor)
}
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>>
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,
{
let mut builder = B::init();
value.walker_mut().walk(builder.as_visitor())?;
builder.finish().map_err(UniError::Visitor)
}
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>>
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,
{
let mut builder = B::init();
value.walker().walk(builder.as_visitor())?;
builder.finish().map_err(UniError::Visitor)
}