use core::fmt;
use core::fmt::Display;
#[cfg(feature = "std")]
use std::error;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
#[repr(u64)]
pub enum SpaVersion {
V1 = 1,
V2 = 2,
V3 = 3,
V4 = 4,
V5 = 5,
V6 = 6,
V7 = 7,
V8 = 8,
V9 = 9,
V10 = 10,
V11 = 11,
V12 = 12,
V13 = 13,
V14 = 14,
V15 = 15,
V16 = 16,
V17 = 17,
V18 = 18,
V19 = 19,
V20 = 20,
V21 = 21,
V22 = 22,
V23 = 23,
V24 = 24,
V25 = 25,
V26 = 26,
V27 = 27,
V28 = 28,
V5000 = 5000,
}
impl Display for SpaVersion {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", u64::from(*self))
}
}
impl From<SpaVersion> for u64 {
fn from(val: SpaVersion) -> u64 {
val as u64
}
}
impl TryFrom<u64> for SpaVersion {
type Error = SpaVersionError;
fn try_from(version: u64) -> Result<Self, Self::Error> {
match version {
1 => Ok(SpaVersion::V1),
2 => Ok(SpaVersion::V2),
3 => Ok(SpaVersion::V3),
4 => Ok(SpaVersion::V4),
5 => Ok(SpaVersion::V5),
6 => Ok(SpaVersion::V6),
7 => Ok(SpaVersion::V7),
8 => Ok(SpaVersion::V8),
9 => Ok(SpaVersion::V9),
10 => Ok(SpaVersion::V10),
11 => Ok(SpaVersion::V11),
12 => Ok(SpaVersion::V12),
13 => Ok(SpaVersion::V13),
14 => Ok(SpaVersion::V14),
15 => Ok(SpaVersion::V15),
16 => Ok(SpaVersion::V16),
17 => Ok(SpaVersion::V17),
18 => Ok(SpaVersion::V18),
19 => Ok(SpaVersion::V19),
20 => Ok(SpaVersion::V20),
21 => Ok(SpaVersion::V21),
22 => Ok(SpaVersion::V22),
23 => Ok(SpaVersion::V23),
24 => Ok(SpaVersion::V24),
25 => Ok(SpaVersion::V25),
26 => Ok(SpaVersion::V26),
27 => Ok(SpaVersion::V27),
28 => Ok(SpaVersion::V28),
5000 => Ok(SpaVersion::V5000),
_ => Err(SpaVersionError::Unknown { version }),
}
}
}
#[derive(Debug)]
pub enum SpaVersionError {
Unknown {
version: u64,
},
}
impl fmt::Display for SpaVersionError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
SpaVersionError::Unknown { version } => {
write!(f, "Unknown SpaVersion {version}")
}
}
}
}
#[cfg(feature = "std")]
impl error::Error for SpaVersionError {
fn source(&self) -> Option<&(dyn error::Error + 'static)> {
None
}
}