use std::str::FromStr;
use serde::{Deserialize, Deserializer, Serialize, Serializer};
use strum_macros::{Display, EnumString, AsRefStr};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Display, EnumString, AsRefStr)]
#[non_exhaustive]
pub enum StandardBizStep {
#[strum(serialize = "urn:epcglobal:cbv:bizstep:accepting")]
Accepting,
#[strum(serialize = "urn:epcglobal:cbv:bizstep:arriving")]
Arriving,
#[strum(serialize = "urn:epcglobal:cbv:bizstep:assembling")]
Assembling,
#[strum(serialize = "urn:epcglobal:cbv:bizstep:collecting")]
Collecting,
#[strum(serialize = "urn:epcglobal:cbv:bizstep:commissioning")]
Commissioning,
#[strum(serialize = "urn:epcglobal:cbv:bizstep:decommissioning")]
Decommissioning,
#[strum(serialize = "urn:epcglobal:cbv:bizstep:departing")]
Departing,
#[strum(serialize = "urn:epcglobal:cbv:bizstep:destroying")]
Destroying,
#[strum(serialize = "urn:epcglobal:cbv:bizstep:disassembling")]
Disassembling,
#[strum(serialize = "urn:epcglobal:cbv:bizstep:entering_exiting")]
EnteringExiting,
#[strum(serialize = "urn:epcglobal:cbv:bizstep:holding")]
Holding,
#[strum(serialize = "urn:epcglobal:cbv:bizstep:inspecting")]
Inspecting,
#[strum(serialize = "urn:epcglobal:cbv:bizstep:installing")]
Installing,
#[strum(serialize = "urn:epcglobal:cbv:bizstep:killing")]
Killing,
#[strum(serialize = "urn:epcglobal:cbv:bizstep:loading")]
Loading,
#[strum(serialize = "urn:epcglobal:cbv:bizstep:other")]
Other,
#[strum(serialize = "urn:epcglobal:cbv:bizstep:packing")]
Packing,
#[strum(serialize = "urn:epcglobal:cbv:bizstep:picking")]
Picking,
#[strum(serialize = "urn:epcglobal:cbv:bizstep:receiving")]
Receiving,
#[strum(serialize = "urn:epcglobal:cbv:bizstep:removing")]
Removing,
#[strum(serialize = "urn:epcglobal:cbv:bizstep:repackaging")]
Repackaging,
#[strum(serialize = "urn:epcglobal:cbv:bizstep:repairing")]
Repairing,
#[strum(serialize = "urn:epcglobal:cbv:bizstep:reselling")]
Reselling,
#[strum(serialize = "urn:epcglobal:cbv:bizstep:shipping")]
Shipping,
#[strum(serialize = "urn:epcglobal:cbv:bizstep:stocking")]
Stocking,
#[strum(serialize = "urn:epcglobal:cbv:bizstep:storing")]
Storing,
#[strum(serialize = "urn:epcglobal:cbv:bizstep:transporting")]
Transporting,
#[strum(serialize = "urn:epcglobal:cbv:bizstep:unloading")]
Unloading,
#[strum(serialize = "urn:epcglobal:cbv:bizstep:unpacking")]
Unpacking,
#[strum(serialize = "urn:epcglobal:cbv:bizstep:voiding")]
Voiding,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum BizStep {
Standard(StandardBizStep),
Custom(String),
}
impl BizStep {
#[must_use]
pub fn as_str(&self) -> &str {
match self {
BizStep::Standard(s) => s.as_ref(),
BizStep::Custom(c) => c.as_str(),
}
}
}
impl FromStr for BizStep {
type Err = std::convert::Infallible;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match StandardBizStep::from_str(s) {
Ok(standard) => Ok(BizStep::Standard(standard)),
Err(_) => Ok(BizStep::Custom(s.to_string())),
}
}
}
impl Serialize for BizStep {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
serializer.serialize_str(self.as_str())
}
}
impl<'de> Deserialize<'de> for BizStep {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
let s = String::deserialize(deserializer)?;
Ok(BizStep::from_str(&s).unwrap())
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Display, EnumString, AsRefStr)]
#[non_exhaustive]
pub enum StandardDisposition {
#[strum(serialize = "urn:epcglobal:cbv:disp:active")]
Active,
#[strum(serialize = "urn:epcglobal:cbv:disp:container_closed")]
ContainerClosed,
#[strum(serialize = "urn:epcglobal:cbv:disp:container_open")]
ContainerOpen,
#[strum(serialize = "urn:epcglobal:cbv:disp:damaged")]
Damaged,
#[strum(serialize = "urn:epcglobal:cbv:disp:destroyed")]
Destroyed,
#[strum(serialize = "urn:epcglobal:cbv:disp:dispensed")]
Dispensed,
#[strum(serialize = "urn:epcglobal:cbv:disp:disposed")]
Disposed,
#[strum(serialize = "urn:epcglobal:cbv:disp:encoded")]
Encoded,
#[strum(serialize = "urn:epcglobal:cbv:disp:expired")]
Expired,
#[strum(serialize = "urn:epcglobal:cbv:disp:in_progress")]
InProgress,
#[strum(serialize = "urn:epcglobal:cbv:disp:in_transit")]
InTransit,
#[strum(serialize = "urn:epcglobal:cbv:disp:inactive")]
Inactive,
#[strum(serialize = "urn:epcglobal:cbv:disp:no_pedigree_match")]
NoPedigreeMatch,
#[strum(serialize = "urn:epcglobal:cbv:disp:non_sellable")]
NonSellable,
#[strum(serialize = "urn:epcglobal:cbv:disp:non_disposed")]
NonDisposed,
#[strum(serialize = "urn:epcglobal:cbv:disp:parts_damaged")]
PartsDamaged,
#[strum(serialize = "urn:epcglobal:cbv:disp:pedigree_match")]
PedigreeMatch,
#[strum(serialize = "urn:epcglobal:cbv:disp:recalled")]
Recalled,
#[strum(serialize = "urn:epcglobal:cbv:disp:receiving_unconfirmed")]
ReceivingUnconfirmed,
#[strum(serialize = "urn:epcglobal:cbv:disp:reshelved")]
Reshelved,
#[strum(serialize = "urn:epcglobal:cbv:disp:returned")]
Returned,
#[strum(serialize = "urn:epcglobal:cbv:disp:sellable_accessible")]
SellableAccessible,
#[strum(serialize = "urn:epcglobal:cbv:disp:sellable_not_accessible")]
SellableNotAccessible,
#[strum(serialize = "urn:epcglobal:cbv:disp:stolen")]
Stolen,
#[strum(serialize = "urn:epcglobal:cbv:disp:unknown")]
Unknown,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum Disposition {
Standard(StandardDisposition),
Custom(String),
}
impl Disposition {
#[must_use]
pub fn as_str(&self) -> &str {
match self {
Disposition::Standard(s) => s.as_ref(),
Disposition::Custom(c) => c.as_str(),
}
}
}
impl FromStr for Disposition {
type Err = std::convert::Infallible;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match StandardDisposition::from_str(s) {
Ok(standard) => Ok(Disposition::Standard(standard)),
Err(_) => Ok(Disposition::Custom(s.to_string())),
}
}
}
impl Serialize for Disposition {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
serializer.serialize_str(self.as_str())
}
}
impl<'de> Deserialize<'de> for Disposition {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
let s = String::deserialize(deserializer)?;
Ok(Disposition::from_str(&s).unwrap())
}
}