use std::convert::TryFrom;
use num_derive::FromPrimitive;
use num_traits::FromPrimitive;
use serde::{Deserialize, Serialize};
use strum_macros::{Display, EnumString, IntoStaticStr};
#[derive(thiserror::Error, Debug)]
pub enum ParseError {
#[error("Tried to convert a number ({0}) to the enum, which was not in its range.")]
InvalidIndex(u8),
}
macro_rules! impl_oxrl {
($name:ident, $fmt_prefix:expr, $r_prefix:ident) => {
impl From<$name> for u8 {
fn from(oxrl: $name) -> Self {
oxrl as u8
}
}
impl TryFrom<u8> for $name {
type Error = ParseError;
fn try_from(num: u8) -> Result<Self, Self::Error> {
let parsed: Option<$name> = FromPrimitive::from_u8(num);
parsed.ok_or_else(|| ParseError::InvalidIndex(num))
}
}
};
}
#[derive(
IntoStaticStr,
Display,
EnumString,
FromPrimitive,
Copy,
Clone,
Debug,
PartialEq,
Eq,
Serialize,
Deserialize,
)]
pub enum Otrl {
#[serde(rename = "OTRL-1")]
Ideation = 1,
#[serde(rename = "OTRL-2")]
Conception = 2,
#[serde(rename = "OTRL-3")]
Development = 3,
#[serde(rename = "OTRL-4")]
PrototypingAndTesting = 4,
#[serde(rename = "OTRL-5")]
ManufacturingDevelopment = 5,
#[serde(rename = "OTRL-6")]
ProductQualification = 6,
}
impl_oxrl!(Otrl, "OTRL", R_OTRL_PREFIX);
#[derive(
IntoStaticStr,
Display,
EnumString,
FromPrimitive,
Copy,
Clone,
Debug,
PartialEq,
Eq,
Serialize,
Deserialize,
)]
pub enum Odrl {
#[serde(rename = "ODRL-1")]
Started = 1,
#[serde(rename = "ODRL-2")]
Minimal = 2,
#[serde(rename = "ODRL-3")]
Full = 3,
#[serde(rename = "ODRL-3*")]
Audited = 4,
#[serde(rename = "ODRL-4")]
QualificationReady = 5,
}
impl_oxrl!(Odrl, "ODRL", R_ODRL_PREFIX);