ddex_parser/transform/
graph.rs1use crate::error::ParseError;
4use ddex_core::models::graph::{
5 ERNMessage, MessageHeader, MessageType, MessageSender, MessageRecipient,
6 Release
7};
8use ddex_core::models::versions::ERNVersion;
9use quick_xml::Reader;
10use quick_xml::events::Event;
11use std::io::BufRead;
12
13pub struct GraphBuilder {
14 version: ERNVersion,
15}
16
17impl GraphBuilder {
18 pub fn new(version: ERNVersion) -> Self {
19 Self { version }
20 }
21
22 pub fn build_from_xml<R: BufRead>(&self, reader: R) -> Result<ERNMessage, ParseError> {
23 let mut xml_reader = Reader::from_reader(reader);
24 xml_reader.config_mut().trim_text(true);
25
26 let message_header = self.parse_header(&mut xml_reader)?;
27 let mut releases = Vec::new();
28 let resources = Vec::new(); let parties = Vec::new(); let deals = Vec::new(); let mut buf = Vec::new();
34 let mut in_release_list = false;
35
36 loop {
37 match xml_reader.read_event_into(&mut buf) {
38 Ok(Event::Start(ref e)) => {
39 match e.name().as_ref() {
40 b"ReleaseList" => in_release_list = true,
41 b"Release" if in_release_list => {
42 releases.push(self.parse_minimal_release(&mut xml_reader)?);
44 }
45 _ => {}
46 }
47 }
48 Ok(Event::End(ref e)) => {
49 if e.name().as_ref() == b"ReleaseList" {
50 in_release_list = false;
51 }
52 }
53 Ok(Event::Eof) => break,
54 _ => {}
55 }
56 buf.clear();
57 }
58
59 Ok(ERNMessage {
60 message_header,
61 parties,
62 resources,
63 releases,
64 deals,
65 version: self.version,
66 profile: None,
67 message_audit_trail: None,
68 extensions: None,
69 comments: None,
70 })
71 }
72
73 fn parse_header<R: BufRead>(&self, _reader: &mut Reader<R>) -> Result<MessageHeader, ParseError> {
74 use chrono::Utc;
75
76 Ok(MessageHeader {
78 message_id: format!("MSG_{:?}", self.version),
79 message_type: MessageType::NewReleaseMessage,
80 message_created_date_time: Utc::now(),
81 message_sender: MessageSender {
82 party_id: Vec::new(),
83 party_name: Vec::new(),
84 trading_name: None,
85 },
86 message_recipient: MessageRecipient {
87 party_id: Vec::new(),
88 party_name: Vec::new(),
89 trading_name: None,
90 },
91 message_control_type: None,
92 message_thread_id: Some("THREAD_001".to_string()),
93 })
94 }
95
96 fn parse_minimal_release<R: BufRead>(&self, reader: &mut Reader<R>) -> Result<Release, ParseError> {
97 use ddex_core::models::common::LocalizedString;
98
99 let release = Release { release_reference: format!("R_{:?}", self.version),
101 release_id: Vec::new(),
102 release_title: vec![LocalizedString::new(format!("Test Release {:?}", self.version))],
103 release_subtitle: None,
104 release_type: None,
105 genre: Vec::new(),
106 release_resource_reference_list: Vec::new(),
107 display_artist: Vec::new(),
108 party_list: Vec::new(),
109 release_date: Vec::new(),
110 territory_code: Vec::new(),
111 excluded_territory_code: Vec::new(),
112 };
113
114 let mut buf = Vec::new();
116 let mut depth = 1;
117 while depth > 0 {
118 match reader.read_event_into(&mut buf) {
119 Ok(Event::Start(_)) => depth += 1,
120 Ok(Event::End(_)) => depth -= 1,
121 Ok(Event::Eof) => break,
122 _ => {}
123 }
124 buf.clear();
125 }
126
127 Ok(release)
128 }
129}