Skip to main content

imferno_core/validation/
isxd_codes.rs

1//! Typed validation-code catalogue for SMPTE ST 2067-202 (ISXD Plug-in).
2
3use crate::diagnostics::codes::ValidationCode;
4use crate::diagnostics::{Category, Severity};
5
6// ─────────────────────────────────────────────────────────────────────────────
7// Spec-agnostic reason codes
8// ─────────────────────────────────────────────────────────────────────────────
9
10/// Spec-agnostic reason codes for ISXD Plug-in validation.
11///
12/// Passed to each edition's `for_code` dispatch function to get the full
13/// `&'static str` code without any runtime string building.
14#[derive(Debug, Clone, Copy, PartialEq, Eq)]
15pub enum IsxdCode {
16    /// ISXDDataEssenceDescriptor: ContainerConstraintsSubDescriptor shall be present (§5).
17    SubDescriptorMissing,
18    /// ISXDDataEssenceDescriptor: NamespaceURI is absent (§5).
19    NamespaceUriMissing,
20    /// ISXDSequence shall contain at least one Resource (§6).
21    ISXDSequenceNoResources,
22    /// ISXDSequence Resource.SourceEncoding does not reference an ISXDDataEssenceDescriptor (§6).
23    ISXDSequenceSourceEncodingInvalid,
24    /// Resources in the same ISXDSequence reference descriptors with inconsistent NamespaceURI values (§6).
25    NamespaceUriMismatch,
26}
27
28// ─────────────────────────────────────────────────────────────────────────────
29// Edition-specific enum (generated by macro)
30// ─────────────────────────────────────────────────────────────────────────────
31
32macro_rules! define_isxd_enum {
33    ($name:ident, $prefix:literal) => {
34        /// ISXD Plug-in validation codes, edition
35        #[doc = $prefix]
36        #[derive(Debug, Clone, Copy, PartialEq, Eq, strum::EnumIter)]
37        pub enum $name {
38            /// ISXDDataEssenceDescriptor: ContainerConstraintsSubDescriptor shall be present (§5).
39            SubDescriptorMissing,
40            /// ISXDDataEssenceDescriptor: NamespaceURI is absent (§5).
41            NamespaceUriMissing,
42            /// ISXDSequence shall contain at least one Resource (§6).
43            ISXDSequenceNoResources,
44            /// ISXDSequence Resource.SourceEncoding does not reference an ISXDDataEssenceDescriptor (§6).
45            ISXDSequenceSourceEncodingInvalid,
46            /// Resources in the same ISXDSequence reference descriptors with inconsistent NamespaceURI values (§6).
47            NamespaceUriMismatch,
48        }
49
50        impl ValidationCode for $name {
51            fn code(&self) -> &'static str {
52                match self {
53                    Self::SubDescriptorMissing              => concat!($prefix, ":5/SubDescriptorMissing"),
54                    Self::NamespaceUriMissing               => concat!($prefix, ":5/NamespaceUriMissing"),
55                    Self::ISXDSequenceNoResources           => concat!($prefix, ":6/ISXDSequenceNoResources"),
56                    Self::ISXDSequenceSourceEncodingInvalid => concat!($prefix, ":6/ISXDSequenceSourceEncodingInvalid"),
57                    Self::NamespaceUriMismatch              => concat!($prefix, ":6/NamespaceUriMismatch"),
58                }
59            }
60            fn description(&self) -> &'static str {
61                match self {
62                    Self::SubDescriptorMissing =>
63                        "ISXDDataEssenceDescriptor: ContainerConstraintsSubDescriptor shall be present.",
64                    Self::NamespaceUriMissing =>
65                        "ISXDDataEssenceDescriptor: NamespaceURI is absent.",
66                    Self::ISXDSequenceNoResources =>
67                        "ISXDSequence shall contain at least one Resource.",
68                    Self::ISXDSequenceSourceEncodingInvalid =>
69                        "ISXDSequence Resource.SourceEncoding does not reference an ISXDDataEssenceDescriptor.",
70                    Self::NamespaceUriMismatch =>
71                        "Resources in the same ISXDSequence reference descriptors with inconsistent NamespaceURI values.",
72                }
73            }
74            fn default_severity(&self) -> Severity {
75                match self {
76                    Self::NamespaceUriMissing => Severity::Warning,
77                    _ => Severity::Error,
78                }
79            }
80            fn category(&self) -> Category {
81                Category::Audio
82            }
83        }
84
85        impl $name {
86            pub const ALL: &'static [Self] = &[
87                Self::SubDescriptorMissing,
88                Self::NamespaceUriMissing,
89                Self::ISXDSequenceNoResources,
90                Self::ISXDSequenceSourceEncodingInvalid,
91                Self::NamespaceUriMismatch,
92            ];
93
94            /// Dispatch from the spec-agnostic [`IsxdCode`] to this
95            /// edition's static code string. Used by the shared validator helpers.
96            pub fn for_code(r: IsxdCode) -> &'static str {
97                match r {
98                    IsxdCode::SubDescriptorMissing              => concat!($prefix, ":5/SubDescriptorMissing"),
99                    IsxdCode::NamespaceUriMissing               => concat!($prefix, ":5/NamespaceUriMissing"),
100                    IsxdCode::ISXDSequenceNoResources           => concat!($prefix, ":6/ISXDSequenceNoResources"),
101                    IsxdCode::ISXDSequenceSourceEncodingInvalid => concat!($prefix, ":6/ISXDSequenceSourceEncodingInvalid"),
102                    IsxdCode::NamespaceUriMismatch              => concat!($prefix, ":6/NamespaceUriMismatch"),
103                }
104            }
105        }
106
107        impl From<$name> for String {
108            fn from(c: $name) -> String {
109                c.code().to_string()
110            }
111        }
112    };
113}
114
115define_isxd_enum!(St2067_202_2022, "ST2067-202:2022");