use crate::core::app_hdr::{BusinessHeader, parse_business_header};
use crate::core::metadata::{MessageMetadata, extract};
use crate::core::mx_message::detect;
use crate::core::xml_scan::outer_element;
use crate::core::{Error, MxId, from_xml};
#[derive(Debug, Clone, Default, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct BusinessMessage {
pub header: Option<BusinessHeader>,
pub id: Option<MxId>,
pub metadata: MessageMetadata,
}
pub fn read_business_message(xml: &str) -> BusinessMessage {
if crate::core::validate_xml(xml, crate::core::ParseLimits::default()).is_err() {
return BusinessMessage::default();
}
BusinessMessage {
header: parse_business_header(xml),
id: detect(xml),
metadata: extract(xml),
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct Envelope<D> {
pub header: Option<BusinessHeader>,
pub document: D,
}
pub fn parse_envelope<D: yaserde::YaDeserialize>(xml: &str) -> Result<Envelope<D>, Error> {
crate::core::validate_xml(xml, crate::core::ParseLimits::default())
.map_err(|error| Error::Deserialize(error.to_string()))?;
let header = parse_business_header(xml);
let doc_xml = outer_element(xml, "Document").unwrap_or_else(|| xml.to_string());
let document = from_xml::<D>(&doc_xml)?;
Ok(Envelope { header, document })
}