use crate::{Serializable, Deserializable};
use std::convert::TryFrom;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ExitStatus {
Success,
Failed,
GasExhausted,
}
impl borsh::BorshSerialize for ExitStatus {
fn serialize<W: std::io::Write>(&self, writer: &mut W) -> std::io::Result<()> {
let c: u8 = self.clone().into();
c.serialize(writer)
}
}
impl borsh::BorshDeserialize for ExitStatus {
fn deserialize_reader<R: std::io::Read>(reader: &mut R) -> std::io::Result<Self> {
let b = u8::deserialize_reader(reader)?;
match Self::try_from(b) {
Ok(sc) => Ok(sc),
Err(_) => Err(std::io::Error::new(std::io::ErrorKind::InvalidData, "Cannot convert from ExitStatus"))
}
}
}
impl From<ExitStatus> for u8 {
fn from(exit_status: ExitStatus) -> Self {
exit_status as u8
}
}
impl TryFrom<u8> for ExitStatus {
type Error = ();
fn try_from(value: u8) -> Result<Self, Self::Error> {
match value {
x if x == ExitStatus::Success as u8 => Ok(ExitStatus::Success),
x if x == ExitStatus::Failed as u8 => Ok(ExitStatus::Failed),
x if x == ExitStatus::GasExhausted as u8 => Ok(ExitStatus::GasExhausted),
_ => Err(()),
}
}
}
impl Serializable for ExitStatus {}
impl Deserializable for ExitStatus {}