use super::*;
use ark_std::format;
#[derive(Clone, Debug)]
#[repr(transparent)]
pub struct ArkScaleError(pub scale::Error);
impl fmt::Display for ArkScaleError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> {
self.0.fmt(f)
}
}
impl ark_std::error::Error for ArkScaleError {} pub fn scale_error_to_ark_error(error: scale::Error) -> io::Error {
io::Error::new(io::ErrorKind::UnexpectedEof, ArkScaleError(error))
}
pub fn ark_error_to_scale_error(error: SerializationError) -> scale::Error {
use SerializationError::*;
match error {
NotEnoughSpace => "Arkworks deserialization failed: NotEnoughSpace".into(),
InvalidData => "Arkworks deserialization failed: InvalidData".into(),
UnexpectedFlags => "Arkworks deserialization failed: UnexpectedFlags".into(),
IoError(io_error) => {
let err_msg: scale::Error = "Arkworks deserialization io error".into();
let err_msg = err_msg.chain(format!("{}", &io_error));
#[cfg(feature = "std")]
if let Some(boxed_dyn_error) = io_error.into_inner() {
if let Ok(error) = boxed_dyn_error.downcast::<ArkScaleError>() {
return error.0;
}
}
err_msg
}
}
}
pub struct InputAsRead<'a, I: Input>(pub &'a mut I);
impl<'a, I: Input> Read for InputAsRead<'a, I> {
fn read(&mut self, _buf: &mut [u8]) -> io::Result<usize> {
panic!("At present Scale uses only read_exact, but if this changes then we should handle lengths correctly.");
}
fn read_exact(&mut self, buf: &mut [u8]) -> io::Result<()> {
self.0.read(buf).map_err(scale_error_to_ark_error)?;
Ok(())
}
}
pub struct OutputAsWrite<'a, O: Output + ?Sized>(pub &'a mut O);
impl<'a, I: Output + ?Sized> Write for OutputAsWrite<'a, I> {
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
self.0.write(buf);
Ok(buf.len())
}
fn flush(&mut self) -> ArkResult<()> {
Ok(())
}
}