use std::convert::TryFrom;
use crate::ErrorCode;
pub const MARK: u8 = b'('; pub const STOP: u8 = b'.'; pub const POP: u8 = b'0'; pub const POP_MARK: u8 = b'1'; pub const DUP: u8 = b'2'; pub const FLOAT: u8 = b'F'; pub const INT: u8 = b'I'; pub const BININT: u8 = b'J'; pub const BININT1: u8 = b'K'; pub const LONG: u8 = b'L'; pub const BININT2: u8 = b'M'; pub const NONE: u8 = b'N'; pub const STRING: u8 = b'S'; pub const BINSTRING: u8 = b'T'; pub const SHORT_BINSTRING: u8 = b'U'; pub const UNICODE: u8 = b'V'; pub const BINUNICODE: u8 = b'X'; pub const APPEND: u8 = b'a'; pub const DICT: u8 = b'd'; pub const EMPTY_DICT: u8 = b'}'; pub const APPENDS: u8 = b'e'; pub const LIST: u8 = b'l'; pub const EMPTY_LIST: u8 = b']'; pub const SETITEM: u8 = b's'; pub const TUPLE: u8 = b't'; pub const EMPTY_TUPLE: u8 = b')'; pub const SETITEMS: u8 = b'u'; pub const BINFLOAT: u8 = b'G'; pub const PUT: u8 = b'p'; pub const BINPUT: u8 = b'q'; pub const LONG_BINPUT: u8 = b'r'; pub const GET: u8 = b'g'; pub const BINGET: u8 = b'h'; pub const LONG_BINGET: u8 = b'j'; pub const GLOBAL: u8 = b'c'; pub const STACK_GLOBAL: u8 = b'\x93'; pub const REDUCE: u8 = b'R'; pub const PROTO: u8 = b'\x80'; pub const TUPLE1: u8 = b'\x85'; pub const TUPLE2: u8 = b'\x86'; pub const TUPLE3: u8 = b'\x87'; pub const NEWTRUE: u8 = b'\x88'; pub const NEWFALSE: u8 = b'\x89'; pub const LONG1: u8 = b'\x8a'; pub const LONG4: u8 = b'\x8b'; pub const BINBYTES: u8 = b'B'; pub const SHORT_BINBYTES: u8 = b'C'; pub const SHORT_BINUNICODE: u8 = b'\x8c'; pub const BINUNICODE8: u8 = b'\x8d'; pub const BINBYTES8: u8 = b'\x8e'; pub const EMPTY_SET: u8 = b'\x8f'; pub const ADDITEMS: u8 = b'\x90'; pub const FROZENSET: u8 = b'\x91'; pub const MEMOIZE: u8 = b'\x94'; pub const FRAME: u8 = b'\x95'; pub const INST: u8 = b'i'; pub const OBJ: u8 = b'o'; pub const BUILD: u8 = b'b'; pub const NEWOBJ: u8 = b'\x81'; pub const NEWOBJ_EX: u8 = b'\x92'; pub const BYTEARRAY8: u8 = b'\x96';
#[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 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)),
}
}
}