ddex_core/models/flat/
message.rs

1// core/src/models/flat/message.rs
2//! Flattened message types
3
4use super::{ParsedDeal, ParsedRelease, ParsedResource};
5use crate::models::{
6    graph::{ERNMessage, Party},
7    Extensions,
8};
9use chrono::{DateTime, Utc};
10use indexmap::IndexMap;
11use serde::{Deserialize, Serialize};
12
13#[derive(Debug, Clone, Serialize, Deserialize)]
14pub struct ParsedERNMessage {
15    pub graph: ERNMessage,
16    pub flat: FlattenedMessage,
17    /// Extensions from the original XML that need preservation
18    pub extensions: Option<Extensions>,
19}
20
21impl ParsedERNMessage {
22    pub fn releases(&self) -> &[ParsedRelease] {
23        &self.flat.releases
24    }
25
26    pub fn resources(&self) -> &IndexMap<String, ParsedResource> {
27        &self.flat.resources
28    }
29
30    pub fn deals(&self) -> &[ParsedDeal] {
31        &self.flat.deals
32    }
33
34    pub fn parties(&self) -> &IndexMap<String, Party> {
35        &self.flat.parties
36    }
37}
38
39#[derive(Debug, Clone, Serialize, Deserialize)]
40pub struct FlattenedMessage {
41    pub message_id: String,
42    pub message_type: String,
43    pub message_date: DateTime<Utc>,
44    pub sender: Organization,
45    pub recipient: Organization,
46    pub releases: Vec<ParsedRelease>,
47    pub resources: IndexMap<String, ParsedResource>,
48    pub deals: Vec<ParsedDeal>,
49    pub parties: IndexMap<String, Party>,
50    pub version: String,
51    pub profile: Option<String>,
52    pub stats: MessageStats,
53    /// Extensions for flattened message
54    pub extensions: Option<Extensions>,
55}
56
57#[derive(Debug, Clone, Serialize, Deserialize)]
58pub struct Organization {
59    pub name: String,
60    pub id: String,
61    /// Extensions for organization
62    pub extensions: Option<Extensions>,
63}
64
65#[derive(Debug, Clone, Serialize, Deserialize)]
66pub struct MessageStats {
67    pub release_count: usize,
68    pub track_count: usize,
69    pub deal_count: usize,
70    pub total_duration: u64,
71}