use std::convert::TryFrom;
use crate::ErrorCode;
#[repr(u8)]
#[derive(Debug, Copy, Clone)]
pub enum Opcode {
Mark = b'(', Stop = b'.', Pop = b'0', PopMark = b'1', Dup = b'2', Float = b'F', Int = b'I', BinInt = b'J', BinInt1 = b'K', Long = b'L', BinInt2 = b'M', None = b'N', String = b'S', BinString = b'T', ShortBinString = b'U', Unicode = b'V', BinUnicode = b'X', Append = b'a', Dict = b'd', EmptyDict = b'}', Appends = b'e', List = b'l', EmptyList = b']', SetItem = b's', Tuple = b't', EmptyTuple = b')', SetItems = b'u', BinFloat = b'G', Put = b'p', BinPut = b'q', LongBinPut = b'r', Get = b'g', BinGet = b'h', LongBinGet = b'j', Global = b'c', StackGlobal = b'\x93', Reduce = b'R', Proto = b'\x80', Tuple1 = b'\x85', Tuple2 = b'\x86', Tuple3 = b'\x87', NewTrue = b'\x88', NewFalse = b'\x89', Long1 = b'\x8a', Long4 = b'\x8b', BinBytes = b'B', ShortBinBytes = b'C', ShortBinUnicode = b'\x8c', BinUnicode8 = b'\x8d', BinBytes8 = b'\x8e', EmptySet = b'\x8f', AddItems = b'\x90', FrozenSet = b'\x91', Memoize = b'\x94', Frame = b'\x95', Inst = b'i', Obj = b'o', Build = b'b', NewObj = b'\x81', NewObjEx = b'\x92', ByteArray8 = b'\x96', }
impl Opcode {
#[inline]
pub const fn to_u8(self) -> u8 {
self as u8
}
}
impl From<Opcode> for u8 {
#[inline]
fn from(opcode: Opcode) -> u8 {
opcode as u8
}
}
impl TryFrom<u8> for Opcode {
type Error = ErrorCode;
fn try_from(value: u8) -> Result<Self, Self::Error> {
match value {
b'(' => Ok(Opcode::Mark),
b'.' => Ok(Opcode::Stop),
b'0' => Ok(Opcode::Pop),
b'1' => Ok(Opcode::PopMark),
b'2' => Ok(Opcode::Dup),
b'F' => Ok(Opcode::Float),
b'I' => Ok(Opcode::Int),
b'J' => Ok(Opcode::BinInt),
b'K' => Ok(Opcode::BinInt1),
b'L' => Ok(Opcode::Long),
b'M' => Ok(Opcode::BinInt2),
b'N' => Ok(Opcode::None),
b'S' => Ok(Opcode::String),
b'T' => Ok(Opcode::BinString),
b'U' => Ok(Opcode::ShortBinString),
b'V' => Ok(Opcode::Unicode),
b'X' => Ok(Opcode::BinUnicode),
b'a' => Ok(Opcode::Append),
b'd' => Ok(Opcode::Dict),
b'}' => Ok(Opcode::EmptyDict),
b'e' => Ok(Opcode::Appends),
b'l' => Ok(Opcode::List),
b']' => Ok(Opcode::EmptyList),
b's' => Ok(Opcode::SetItem),
b't' => Ok(Opcode::Tuple),
b')' => Ok(Opcode::EmptyTuple),
b'u' => Ok(Opcode::SetItems),
b'G' => Ok(Opcode::BinFloat),
b'p' => Ok(Opcode::Put),
b'q' => Ok(Opcode::BinPut),
b'r' => Ok(Opcode::LongBinPut),
b'g' => Ok(Opcode::Get),
b'h' => Ok(Opcode::BinGet),
b'j' => Ok(Opcode::LongBinGet),
b'c' => Ok(Opcode::Global),
b'\x93' => Ok(Opcode::StackGlobal),
b'R' => Ok(Opcode::Reduce),
b'\x80' => Ok(Opcode::Proto),
b'\x85' => Ok(Opcode::Tuple1),
b'\x86' => Ok(Opcode::Tuple2),
b'\x87' => Ok(Opcode::Tuple3),
b'\x88' => Ok(Opcode::NewTrue),
b'\x89' => Ok(Opcode::NewFalse),
b'\x8a' => Ok(Opcode::Long1),
b'\x8b' => Ok(Opcode::Long4),
b'B' => Ok(Opcode::BinBytes),
b'C' => Ok(Opcode::ShortBinBytes),
b'\x8c' => Ok(Opcode::ShortBinUnicode),
b'\x8d' => Ok(Opcode::BinUnicode8),
b'\x8e' => Ok(Opcode::BinBytes8),
b'\x8f' => Ok(Opcode::EmptySet),
b'\x90' => Ok(Opcode::AddItems),
b'\x91' => Ok(Opcode::FrozenSet),
b'\x94' => Ok(Opcode::Memoize),
b'\x95' => Ok(Opcode::Frame),
b'i' => Ok(Opcode::Inst),
b'o' => Ok(Opcode::Obj),
b'b' => Ok(Opcode::Build),
b'\x81' => Ok(Opcode::NewObj),
b'\x92' => Ok(Opcode::NewObjEx),
b'\x96' => Ok(Opcode::ByteArray8),
_ => Err(ErrorCode::Unsupported(value as char)),
}
}
}