use crate::error::ParseError;
use ddex_core::models::graph::ERNMessage;
use ddex_core::models::versions::ERNVersion;
use ddex_core::models::versions::VersionDifferences;
pub struct VersionAdapter {
_version: ERNVersion,
_differences: VersionDifferences,
}
impl VersionAdapter {
pub fn new(version: ERNVersion) -> Self {
Self {
_version: version,
_differences: VersionDifferences::for_version(version),
}
}
pub fn adapt_message_header(
&self,
_xml_data: &[u8],
) -> Result<ddex_core::models::graph::MessageHeader, ParseError> {
use ddex_core::models::graph::{
MessageHeader, MessageRecipient, MessageSender, MessageType,
};
Ok(MessageHeader {
message_id: "PLACEHOLDER".to_string(),
message_type: MessageType::NewReleaseMessage,
message_created_date_time: chrono::Utc::now(),
message_sender: MessageSender {
party_id: Vec::new(),
party_name: Vec::new(),
trading_name: None,
extensions: None,
attributes: None,
comments: None,
},
message_recipient: MessageRecipient {
party_id: Vec::new(),
party_name: Vec::new(),
trading_name: None,
extensions: None,
attributes: None,
comments: None,
},
message_control_type: None,
message_thread_id: None,
extensions: None,
attributes: None,
comments: None,
})
}
pub fn adapt_deal_terms(
&self,
_xml_data: &[u8],
) -> Result<ddex_core::models::graph::DealTerms, ParseError> {
use ddex_core::models::graph::DealTerms;
Ok(DealTerms {
validity_period: None,
start_date: None,
end_date: None,
territory_code: Vec::new(),
excluded_territory_code: Vec::new(),
distribution_channel: Vec::new(),
excluded_distribution_channel: Vec::new(),
commercial_model_type: Vec::new(),
use_type: Vec::new(),
price_information: Vec::new(),
wholesale_price: Vec::new(),
suggested_retail_price: Vec::new(),
pre_order_date: None,
pre_order_preview_date: None,
instant_gratification_date: None,
takedown_date: None,
})
}
}
pub struct VersionMigrator;
impl VersionMigrator {
pub fn migrate_382_to_42(message: &ERNMessage) -> Result<ERNMessage, ParseError> {
let mut migrated = message.clone();
migrated.version = ERNVersion::V4_2;
if migrated.message_audit_trail.is_none() {
migrated.message_audit_trail = Some(ddex_core::models::graph::MessageAuditTrail {
audit_trail_events: Vec::new(),
extensions: None,
attributes: None,
comments: None,
});
}
Ok(migrated)
}
pub fn migrate_42_to_43(message: &ERNMessage) -> Result<ERNMessage, ParseError> {
let mut migrated = message.clone();
migrated.version = ERNVersion::V4_3;
Ok(migrated)
}
pub fn downgrade_43_to_42(
message: &ERNMessage,
) -> Result<(ERNMessage, Vec<String>), ParseError> {
let mut downgraded = message.clone();
downgraded.version = ERNVersion::V4_2;
let mut warnings = Vec::new();
if downgraded.profile.is_some() {
warnings.push("Profile information will be lost in 4.2".to_string());
downgraded.profile = None;
}
Ok((downgraded, warnings))
}
}