ddex_builder/linker/
types.rs

1//! Type definitions for the linker module
2
3use std::fmt;
4
5/// Type of entity being linked
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
7pub enum EntityType {
8    /// Release entity
9    Release,
10    /// Resource entity (audio, video, etc.)
11    Resource,
12    /// Party entity (artist, label, etc.)
13    Party,
14    /// Deal entity
15    Deal,
16    /// Technical details
17    TechnicalDetails,
18    /// Rights controller
19    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/// Reference generation style
36#[derive(Debug, Clone)]
37pub enum ReferenceStyle {
38    /// Sequential numbering (A1, A2, R1, R2)
39    Sequential,
40
41    /// Reference format with custom separator
42    Prefixed {
43        /// Separator character(s) between prefix and ID
44        separator: String,
45    },
46
47    /// Custom formatter function
48    Custom(fn(EntityType, u32) -> String),
49}
50
51impl Default for ReferenceStyle {
52    fn default() -> Self {
53        Self::Sequential
54    }
55}
56
57/// Configuration for the reference linker
58#[derive(Debug, Clone)]
59pub struct LinkerConfig {
60    /// Reference generation style
61    pub reference_style: ReferenceStyle,
62
63    /// Enable auto-linking
64    pub auto_link: bool,
65
66    /// Validate references on build
67    pub validate_on_build: bool,
68
69    /// Strict mode (fail on warnings)
70    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/// Link between release and resource
85#[derive(Debug, Clone)]
86pub struct ResourceLink {
87    /// Reference to the release
88    pub release_reference: String,
89    /// Reference to the resource
90    pub resource_reference: String,
91    /// Sequence number in the release
92    pub sequence_number: u32,
93}
94
95/// Release-Resource reference mapping
96#[derive(Debug, Clone)]
97pub struct ReleaseResourceReference {
98    /// Reference to the parent release
99    pub release_reference: String,
100    /// Reference to the linked resource
101    pub resource_reference: String,
102    /// Sequence number in the release
103    pub sequence_number: u32,
104}
105
106/// Statistics for linking operation
107#[derive(Debug, Default)]
108pub struct LinkingStats {
109    /// Number of references generated
110    pub generated_refs: usize,
111    /// Number of resources linked
112    pub linked_resources: usize,
113    /// Number of deals linked
114    pub linked_deals: usize,
115    /// Number of parties linked
116    pub linked_parties: usize,
117    /// Whether validation passed
118    pub validation_passed: bool,
119    /// List of warnings generated
120    pub warnings: Vec<String>,
121}
122
123/// Report from auto-linking process
124#[derive(Debug, Clone, Default)]
125pub struct LinkingReport {
126    /// Number of references generated
127    pub generated_refs: usize,
128    /// Number of resources successfully linked
129    pub linked_resources: usize,
130    /// Number of deals successfully linked
131    pub linked_deals: usize,
132    /// Number of parties successfully linked
133    pub linked_parties: usize,
134    /// Whether all validations passed
135    pub validation_passed: bool,
136    /// List of warnings generated during linking
137    pub warnings: Vec<String>,
138}
139
140/// Linking errors
141#[derive(Debug, thiserror::Error)]
142pub enum LinkingError {
143    /// Reference to unknown resource
144    #[error("Unknown resource: {0}")]
145    UnknownResource(String),
146    /// Reference to unknown release
147    #[error("Unknown release: {0}")]
148    UnknownRelease(String),
149    /// Reference without a target
150    #[error("Orphaned reference: {0}")]
151    OrphanedReference(String),
152    /// Broken reference link
153    #[error("Broken reference from {from} to {to}")]
154    BrokenReference {
155        /// Source of the reference
156        from: String,
157        /// Target that doesn't exist
158        to: String,
159    },
160    /// Duplicate reference ID
161    #[error("Duplicate reference: {0}")]
162    DuplicateReference(String),
163    /// Circular reference detected
164    #[error("Circular reference detected: {0}")]
165    CircularReference(String),
166    /// Invalid entity type for operation
167    #[error("Invalid entity type: {0}")]
168    InvalidEntityType(String),
169    /// Validation failed
170    #[error("Validation failed: {0}")]
171    ValidationFailed(String),
172}