ddex_builder/linker/
types.rs1use std::fmt;
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
7pub enum EntityType {
8 Release,
10 Resource,
12 Party,
14 Deal,
16 TechnicalDetails,
18 RightsController,
20}
21
22impl fmt::Display for EntityType {
23 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
24 match self {
25 Self::Release => write!(f, "Release"),
26 Self::Resource => write!(f, "Resource"),
27 Self::Party => write!(f, "Party"),
28 Self::Deal => write!(f, "Deal"),
29 Self::TechnicalDetails => write!(f, "TechnicalDetails"),
30 Self::RightsController => write!(f, "RightsController"),
31 }
32 }
33}
34
35#[derive(Debug, Clone)]
37pub enum ReferenceStyle {
38 Sequential,
40
41 Prefixed {
43 separator: String,
45 },
46
47 Custom(fn(EntityType, u32) -> String),
49}
50
51impl Default for ReferenceStyle {
52 fn default() -> Self {
53 Self::Sequential
54 }
55}
56
57#[derive(Debug, Clone)]
59pub struct LinkerConfig {
60 pub reference_style: ReferenceStyle,
62
63 pub auto_link: bool,
65
66 pub validate_on_build: bool,
68
69 pub strict: bool,
71}
72
73impl Default for LinkerConfig {
74 fn default() -> Self {
75 Self {
76 reference_style: ReferenceStyle::default(),
77 auto_link: true,
78 validate_on_build: true,
79 strict: false,
80 }
81 }
82}
83
84#[derive(Debug, Clone)]
86pub struct ResourceLink {
87 pub release_reference: String,
89 pub resource_reference: String,
91 pub sequence_number: u32,
93}
94
95#[derive(Debug, Clone)]
97pub struct ReleaseResourceReference {
98 pub release_reference: String,
100 pub resource_reference: String,
102 pub sequence_number: u32,
104}
105
106#[derive(Debug, Default)]
108pub struct LinkingStats {
109 pub generated_refs: usize,
111 pub linked_resources: usize,
113 pub linked_deals: usize,
115 pub linked_parties: usize,
117 pub validation_passed: bool,
119 pub warnings: Vec<String>,
121}
122
123#[derive(Debug, Clone, Default)]
125pub struct LinkingReport {
126 pub generated_refs: usize,
128 pub linked_resources: usize,
130 pub linked_deals: usize,
132 pub linked_parties: usize,
134 pub validation_passed: bool,
136 pub warnings: Vec<String>,
138}
139
140#[derive(Debug, thiserror::Error)]
142pub enum LinkingError {
143 #[error("Unknown resource: {0}")]
145 UnknownResource(String),
146 #[error("Unknown release: {0}")]
148 UnknownRelease(String),
149 #[error("Orphaned reference: {0}")]
151 OrphanedReference(String),
152 #[error("Broken reference from {from} to {to}")]
154 BrokenReference {
155 from: String,
157 to: String,
159 },
160 #[error("Duplicate reference: {0}")]
162 DuplicateReference(String),
163 #[error("Circular reference detected: {0}")]
165 CircularReference(String),
166 #[error("Invalid entity type: {0}")]
168 InvalidEntityType(String),
169 #[error("Validation failed: {0}")]
171 ValidationFailed(String),
172}