use core::result::Result as CoreResult;
use std::io::Error;
use std::io::ErrorKind;
use std::io::Result;
use crate::CapacityError;
use crate::TranscodeEncodeError;
#[must_use]
pub(in crate::transcode::io) fn capacity_error_to_invalid_data(error: CapacityError) -> Error {
Error::new(ErrorKind::InvalidData, error)
}
pub(in crate::transcode::io) fn map_encode_value_result<T, E, Value>(
result: CoreResult<T, TranscodeEncodeError<E, Value>>,
map_error: &mut dyn FnMut(E) -> Error,
) -> Result<T> {
match result {
Ok(value) => Ok(value),
Err(error) => Err(map_encode_value_error(error, map_error)),
}
}
#[must_use]
#[inline(never)]
fn map_encode_value_error<E, Value>(
error: TranscodeEncodeError<E, Value>,
map_error: &mut dyn FnMut(E) -> Error,
) -> Error {
match error {
TranscodeEncodeError::Domain(error) => {
let contextual = error.map_source(&mut *map_error);
let kind = contextual.source().kind();
Error::new(kind, contextual)
}
TranscodeEncodeError::Unencodable { .. } => Error::new(ErrorKind::InvalidInput, "codec cannot encode value"),
TranscodeEncodeError::Failure(_) => Error::new(ErrorKind::InvalidInput, "codec output bound overflow"),
}
}