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