ddex_parser/transform/
graph.rs

1// core/src/transform/graph.rs
2// Remove unused imports and variables
3use 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();  // Remove mut
29        let parties = Vec::new();    // Remove mut
30        let deals = Vec::new();      // Remove mut
31        
32        // Simple parsing to extract at least one release
33        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                            // Create a minimal release
43                            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        // Return a minimal valid header
77        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 {  // Remove mut
100            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        // Skip to the end of the Release element
115        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}