diff options
-rw-r--r-- | src/lib.rs | 23 |
1 files changed, 17 insertions, 6 deletions
@@ -38,17 +38,28 @@ pub trait DecodeError { fn bad_operand(&self) -> bool; } -pub enum ReadError { +#[derive(Debug, PartialEq, Eq, Copy, Clone)] +pub enum StandardDecodeError { ExhaustedInput, - IOError(&'static str), + InvalidOpcode, + InvalidOperand, } -pub trait Reader<Item> { - fn next(&mut self) -> Result<Item, ReadError>; +impl fmt::Display for StandardDecodeError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self { + StandardDecodeError::ExhaustedInput => write!(f, "exhausted input"), + StandardDecodeError::InvalidOpcode => write!(f, "invalid opcode"), + StandardDecodeError::InvalidOperand => write!(f, "invalid operand"), + } + } } -pub trait Decoder<A: Arch + ?Sized> { - type Error: DecodeError + Debug + Display; +impl DecodeError for StandardDecodeError { + fn data_exhausted(&self) -> bool { *self == StandardDecodeError::ExhaustedInput } + fn bad_opcode(&self) -> bool { *self == StandardDecodeError::InvalidOpcode } + fn bad_operand(&self) -> bool { *self == StandardDecodeError::InvalidOperand } +} fn decode<T: Reader<A::Word>>(&self, bytes: &mut T) -> Result<A::Instruction, Self::Error> { let mut inst = A::Instruction::default(); |