use core::convert::Infallible;
use crate::Converter;
pub trait InfallibleConverter: Converter + sealed_converter::Sealed {
fn convert_ok<E>(&mut self, item: Self::Item, buf: &mut E) -> usize
where
E: Extend<Self::Output>;
fn finalize_ok(&mut self);
}
impl<C: Converter> InfallibleConverter for C
where
C::Error: InfallibleError,
{
#[inline]
fn convert_ok<E>(&mut self, item: Self::Item, buf: &mut E) -> usize
where
E: Extend<Self::Output>,
{
self.convert(item, buf).unwrap_infallible()
}
#[inline]
fn finalize_ok(&mut self) {
self.finalize().unwrap_infallible()
}
}
pub trait InfallibleError {}
impl InfallibleError for Infallible {}
pub trait InfallibleResult: sealed_result::Sealed {
type T;
fn unwrap_infallible(self) -> Self::T;
}
impl<T, E: InfallibleError> InfallibleResult for Result<T, E> {
type T = T;
fn unwrap_infallible(self) -> Self::T {
unsafe {
self.unwrap_unchecked()
}
}
}
mod sealed_converter {
pub trait Sealed {}
impl<C: crate::Converter> Sealed for C where C::Error: super::InfallibleError {}
}
mod sealed_result {
pub trait Sealed {}
impl<T, E: super::InfallibleError> Sealed for Result<T, E> {}
}