pub trait ReadFrom: Sized {
type Error;
// Required method
fn read_from<R: Read>(input: R) -> Result<Self, Self::Error>;
}
Expand description
Used to deserialize types from an input stream (i.e. a Read
implementation).
§Example
This implements ReadFrom
for a simple TinyRational
struct.
use read_from::ReadFrom;
use std::io::{self, Cursor, Read};
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct TinyRational {
numer: i8,
denom: u8
}
#[derive(Debug)]
pub enum TinyRationalReadError {
DenomIsZero,
Io(io::Error)
}
impl ReadFrom for TinyRational {
type Error = TinyRationalReadError;
fn read_from<R: Read>(mut inp: R) -> Result<Self, Self::Error> {
let mut buf = [0; 2];
inp.read_exact(&mut buf).map_err(TinyRationalReadError::Io)?;
let numer = buf[0] as i8;
let denom = buf[1] as u8;
if denom == 0 {
Err(TinyRationalReadError::DenomIsZero)
} else {
Ok(Self { numer, denom })
}
}
}
assert_eq!(
TinyRational::read_from(Cursor::new(&[3, 4])).unwrap(),
TinyRational { numer: 3, denom: 4 });
assert!(matches!(
TinyRational::read_from(Cursor::new(&[3, 0])).unwrap_err(),
TinyRationalReadError::DenomIsZero
));
Required Associated Types§
Required Methods§
Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.