ddex_builder/linker/
types.rs

1//! Type definitions for the linker module
2
3use std::fmt;
4use thiserror::Error;
5
6/// Entity types in DDEX
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
8pub enum EntityType {
9    Release,
10    Resource,
11    Party,
12    Deal,
13    TechnicalDetails,
14    RightsController,
15}
16
17impl fmt::Display for EntityType {
18    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
19        match self {
20            Self::Release => write!(f, "Release"),
21            Self::Resource => write!(f, "Resource"),
22            Self::Party => write!(f, "Party"),
23            Self::Deal => write!(f, "Deal"),
24            Self::TechnicalDetails => write!(f, "TechnicalDetails"),
25            Self::RightsController => write!(f, "RightsController"),
26        }
27    }
28}
29
30/// Reference generation style
31#[derive(Debug, Clone)]
32pub enum ReferenceStyle {
33    /// Sequential numbering (A1, A2, R1, R2)
34    Sequential,
35    
36    /// Prefixed with custom separator
37    Prefixed { separator: String },
38    
39    /// Custom formatter function
40    Custom(fn(EntityType, u32) -> String),
41}
42
43impl Default for ReferenceStyle {
44    fn default() -> Self {
45        Self::Sequential
46    }
47}
48
49/// Configuration for the reference linker
50#[derive(Debug, Clone)]
51pub struct LinkerConfig {
52    /// Reference generation style
53    pub reference_style: ReferenceStyle,
54    
55    /// Enable auto-linking
56    pub auto_link: bool,
57    
58    /// Validate references on build
59    pub validate_on_build: bool,
60    
61    /// Strict mode (fail on warnings)
62    pub strict: bool,
63}
64
65impl Default for LinkerConfig {
66    fn default() -> Self {
67        Self {
68            reference_style: ReferenceStyle::default(),
69            auto_link: true,
70            validate_on_build: true,
71            strict: false,
72        }
73    }
74}
75
76/// Release-Resource reference mapping
77#[derive(Debug, Clone)]
78pub struct ReleaseResourceReference {
79    pub release_reference: String,
80    pub resource_reference: String,
81    pub sequence_number: u32,
82}
83
84/// Report from auto-linking process
85#[derive(Debug, Clone, Default)]
86pub struct LinkingReport {
87    pub generated_refs: usize,
88    pub linked_resources: usize,
89    pub linked_deals: usize,
90    pub linked_parties: usize,
91    pub validation_passed: bool,
92    pub warnings: Vec<String>,
93}
94
95/// Linker errors
96#[derive(Debug, Error)]
97pub enum LinkerError {
98    #[error("Unknown resource: {0}")]
99    UnknownResource(String),
100    
101    #[error("Unknown release: {0}")]
102    UnknownRelease(String),
103    
104    #[error("Orphaned reference: {0}")]
105    OrphanedReference(String),
106    
107    #[error("Broken reference from {from} to {to}")]
108    BrokenReference { from: String, to: String },
109    
110    #[error("Duplicate reference: {0}")]
111    DuplicateReference(String),
112    
113    #[error("Circular reference detected: {0}")]
114    CircularReference(String),
115    
116    #[error("Invalid entity type: {0}")]
117    InvalidEntityType(String),
118    
119    #[error("Validation failed: {0}")]
120    ValidationFailed(String),
121}