use crate::message::DvgwMessage;
#[cfg(feature = "alocat")]
use crate::messages::alocat::AlocatMessage;
#[cfg(feature = "nomint")]
use crate::messages::nomint::NomintMessage;
#[cfg(feature = "nomres")]
use crate::messages::nomres::NomresMessage;
#[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>),
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()),
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)
}
}