use core::error::Error;
use core::fmt::{Display, Formatter};
use num_traits::FromPrimitive;
use crate::ember::status::values::Values;
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
pub enum Flash {
WriteInhibited,
VerifyFailed,
ProgFail,
EraseFail,
}
impl Display for Flash {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
match self {
Self::WriteInhibited => write!(f, "write inhibited"),
Self::VerifyFailed => write!(f, "verify failed"),
Self::ProgFail => write!(f, "programming failed"),
Self::EraseFail => write!(f, "erasing failed"),
}
}
}
impl Error for Flash {}
impl From<Flash> for Values {
fn from(flash: Flash) -> Self {
match flash {
Flash::WriteInhibited => Self::ErrFlashWriteInhibited,
Flash::VerifyFailed => Self::ErrFlashVerifyFailed,
Flash::ProgFail => Self::ErrFlashProgFail,
Flash::EraseFail => Self::ErrFlashEraseFail,
}
}
}
impl From<Flash> for u8 {
fn from(flash: Flash) -> Self {
Values::from(flash).into()
}
}
impl TryFrom<Values> for Flash {
type Error = Values;
fn try_from(value: Values) -> Result<Self, Self::Error> {
match value {
Values::ErrFlashWriteInhibited => Ok(Self::WriteInhibited),
Values::ErrFlashVerifyFailed => Ok(Self::VerifyFailed),
Values::ErrFlashProgFail => Ok(Self::ProgFail),
Values::ErrFlashEraseFail => Ok(Self::EraseFail),
_ => Err(value),
}
}
}
impl FromPrimitive for Flash {
fn from_i64(n: i64) -> Option<Self> {
Values::from_i64(n).and_then(|value| Self::try_from(value).ok())
}
fn from_u8(n: u8) -> Option<Self> {
Values::from_u8(n).and_then(|value| Self::try_from(value).ok())
}
fn from_u64(n: u64) -> Option<Self> {
Values::from_u64(n).and_then(|value| Self::try_from(value).ok())
}
}