use std::fmt;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub enum EntityType {
Release,
Resource,
Party,
Deal,
TechnicalDetails,
RightsController,
}
impl fmt::Display for EntityType {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Release => write!(f, "Release"),
Self::Resource => write!(f, "Resource"),
Self::Party => write!(f, "Party"),
Self::Deal => write!(f, "Deal"),
Self::TechnicalDetails => write!(f, "TechnicalDetails"),
Self::RightsController => write!(f, "RightsController"),
}
}
}
#[derive(Debug, Clone)]
pub enum ReferenceStyle {
Sequential,
Prefixed {
separator: String,
},
Custom(fn(EntityType, u32) -> String),
}
impl Default for ReferenceStyle {
fn default() -> Self {
Self::Sequential
}
}
#[derive(Debug, Clone)]
pub struct LinkerConfig {
pub reference_style: ReferenceStyle,
pub auto_link: bool,
pub validate_on_build: bool,
pub strict: bool,
}
impl Default for LinkerConfig {
fn default() -> Self {
Self {
reference_style: ReferenceStyle::default(),
auto_link: true,
validate_on_build: true,
strict: false,
}
}
}
#[derive(Debug, Clone)]
pub struct ResourceLink {
pub release_reference: String,
pub resource_reference: String,
pub sequence_number: u32,
}
#[derive(Debug, Clone)]
pub struct ReleaseResourceReference {
pub release_reference: String,
pub resource_reference: String,
pub sequence_number: u32,
}
#[derive(Debug, Default)]
pub struct LinkingStats {
pub generated_refs: usize,
pub linked_resources: usize,
pub linked_deals: usize,
pub linked_parties: usize,
pub validation_passed: bool,
pub warnings: Vec<String>,
}
#[derive(Debug, Clone, Default)]
pub struct LinkingReport {
pub generated_refs: usize,
pub linked_resources: usize,
pub linked_deals: usize,
pub linked_parties: usize,
pub validation_passed: bool,
pub warnings: Vec<String>,
}
#[derive(Debug, thiserror::Error)]
pub enum LinkingError {
#[error("Unknown resource: {0}")]
UnknownResource(String),
#[error("Unknown release: {0}")]
UnknownRelease(String),
#[error("Orphaned reference: {0}")]
OrphanedReference(String),
#[error("Broken reference from {from} to {to}")]
BrokenReference {
from: String,
to: String,
},
#[error("Duplicate reference: {0}")]
DuplicateReference(String),
#[error("Circular reference detected: {0}")]
CircularReference(String),
#[error("Invalid entity type: {0}")]
InvalidEntityType(String),
#[error("Validation failed: {0}")]
ValidationFailed(String),
}