use crate::message::DvgwMessage;
#[cfg(feature = "alocat")]
use crate::messages::alocat::AlocatMessage;
#[cfg(feature = "delord")]
use crate::messages::delord::DeliveryOrderMessage;
#[cfg(feature = "delres")]
use crate::messages::delres::DeliveryResponseMessage;
#[cfg(feature = "imbnot")]
use crate::messages::imbnot::ImbalanceMessage;
#[cfg(feature = "nomint")]
use crate::messages::nomint::NomintMessage;
#[cfg(feature = "nomres")]
use crate::messages::nomres::NomresMessage;
#[cfg(feature = "schedl")]
use crate::messages::schedl::SchedlMessage;
#[cfg(feature = "tranot")]
use crate::messages::tranot::TransportNotificationMessage;
#[derive(Debug, Clone)]
#[non_exhaustive]
pub enum AnyDvgwMessage {
#[cfg(feature = "alocat")]
Alocat(Box<AlocatMessage>),
#[cfg(feature = "nomint")]
Nomint(Box<NomintMessage>),
#[cfg(feature = "nomres")]
Nomres(Box<NomresMessage>),
#[cfg(feature = "schedl")]
Schedl(Box<SchedlMessage>),
#[cfg(feature = "imbnot")]
Imbnot(Box<ImbalanceMessage>),
#[cfg(feature = "tranot")]
Tranot(Box<TransportNotificationMessage>),
#[cfg(feature = "delord")]
Delord(Box<DeliveryOrderMessage>),
#[cfg(feature = "delres")]
Delres(Box<DeliveryResponseMessage>),
Unknown {
raw_type: String,
segments: Vec<edifact_rs::OwnedSegment>,
},
}
impl AnyDvgwMessage {
#[must_use]
pub fn as_trait(&self) -> Option<&dyn DvgwMessage> {
match self {
#[cfg(feature = "alocat")]
Self::Alocat(m) => Some(m.as_ref()),
#[cfg(feature = "nomint")]
Self::Nomint(m) => Some(m.as_ref()),
#[cfg(feature = "nomres")]
Self::Nomres(m) => Some(m.as_ref()),
#[cfg(feature = "schedl")]
Self::Schedl(m) => Some(m.as_ref()),
#[cfg(feature = "imbnot")]
Self::Imbnot(m) => Some(m.as_ref()),
#[cfg(feature = "tranot")]
Self::Tranot(m) => Some(m.as_ref()),
#[cfg(feature = "delord")]
Self::Delord(m) => Some(m.as_ref()),
#[cfg(feature = "delres")]
Self::Delres(m) => Some(m.as_ref()),
Self::Unknown { .. } => None,
}
}
#[must_use]
pub fn is_unknown(&self) -> bool {
matches!(self, Self::Unknown { .. })
}
#[must_use]
pub fn message_type(&self) -> Option<crate::DvgwMessageType> {
self.as_trait()
.map(super::message::DvgwMessage::message_type)
}
#[must_use]
pub fn detect_pid(&self, role_qualifier: Option<&str>) -> Option<u32> {
self.message_type()?.synthetic_pid(role_qualifier)
}
}