ddex_parser/transform/
version_adapter.rs1use crate::error::ParseError;
5use ddex_core::models::graph::ERNMessage;
6use ddex_core::models::versions::VersionDifferences;
7use ddex_core::models::versions::ERNVersion;
8
9pub struct VersionAdapter {
10 version: ERNVersion,
11 differences: VersionDifferences,
12}
13
14impl VersionAdapter {
15 pub fn new(version: ERNVersion) -> Self {
16 Self {
17 version,
18 differences: VersionDifferences::for_version(version),
19 }
20 }
21
22 pub fn adapt_message_header(&self, _xml_data: &[u8]) -> Result<ddex_core::models::graph::MessageHeader, ParseError> {
24 use ddex_core::models::graph::{MessageHeader, MessageType, MessageSender, MessageRecipient};
26
27 Ok(MessageHeader {
28 message_id: "PLACEHOLDER".to_string(),
29 message_type: MessageType::NewReleaseMessage,
30 message_created_date_time: chrono::Utc::now(),
31 message_sender: MessageSender {
32 party_id: Vec::new(),
33 party_name: Vec::new(),
34 trading_name: None,
35 extensions: None,
36 attributes: None,
37 comments: None,
38 },
39 message_recipient: MessageRecipient {
40 party_id: Vec::new(),
41 party_name: Vec::new(),
42 trading_name: None,
43 extensions: None,
44 attributes: None,
45 comments: None,
46 },
47 message_control_type: None,
48 message_thread_id: None,
49 extensions: None,
50 attributes: None,
51 comments: None,
52 })
53 }
54
55 pub fn adapt_deal_terms(&self, _xml_data: &[u8]) -> Result<ddex_core::models::graph::DealTerms, ParseError> {
57 use ddex_core::models::graph::DealTerms;
59
60 Ok(DealTerms {
61 validity_period: None,
62 start_date: None,
63 end_date: None,
64 territory_code: Vec::new(),
65 excluded_territory_code: Vec::new(),
66 distribution_channel: Vec::new(),
67 excluded_distribution_channel: Vec::new(),
68 commercial_model_type: Vec::new(),
69 use_type: Vec::new(),
70 price_information: Vec::new(),
71 wholesale_price: Vec::new(),
72 suggested_retail_price: Vec::new(),
73 pre_order_date: None,
74 pre_order_preview_date: None,
75 instant_gratification_date: None,
76 takedown_date: None,
77 })
78 }
79}
80
81pub struct VersionMigrator;
83
84impl VersionMigrator {
85 pub fn migrate_382_to_42(message: &ERNMessage) -> Result<ERNMessage, ParseError> {
87 let mut migrated = message.clone();
88 migrated.version = ERNVersion::V4_2;
89
90 if migrated.message_audit_trail.is_none() {
92 migrated.message_audit_trail = Some(ddex_core::models::graph::MessageAuditTrail {
93 audit_trail_events: Vec::new(),
94 extensions: None,
95 attributes: None,
96 comments: None,
97 });
98 }
99
100 Ok(migrated)
101 }
102
103 pub fn migrate_42_to_43(message: &ERNMessage) -> Result<ERNMessage, ParseError> {
105 let mut migrated = message.clone();
106 migrated.version = ERNVersion::V4_3;
107 Ok(migrated)
108 }
109
110 pub fn downgrade_43_to_42(message: &ERNMessage) -> Result<(ERNMessage, Vec<String>), ParseError> {
112 let mut downgraded = message.clone();
113 downgraded.version = ERNVersion::V4_2;
114
115 let mut warnings = Vec::new();
116
117 if downgraded.profile.is_some() {
118 warnings.push("Profile information will be lost in 4.2".to_string());
119 downgraded.profile = None;
120 }
121
122 Ok((downgraded, warnings))
123 }
124}