use crate::diagnostics::codes::ValidationCode;
use crate::diagnostics::{Category, Severity};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum St2067_3Code {
ContentKindUnknown,
SourceEncodingNoEssenceDescriptorList,
SourceEncodingUnresolved,
EssenceDescriptorListEmpty,
ContentVersionListEmpty,
ContentVersionIdInvalid,
ContentVersionLabelTextMissing,
LocaleLanguageTagInvalid,
TrackIdNotUnique,
MarkerOffsetOutOfRange,
MarkerLabelUnknown,
SegmentDuration,
ContentVersionIdDuplicate,
SegmentDurationIntegerEditUnits,
}
macro_rules! define_st2067_3_enum {
($name:ident, $prefix:literal) => {
#[allow(non_camel_case_types)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, strum::EnumIter)]
pub enum $name {
ContentKindUnknown,
SourceEncodingNoEssenceDescriptorList,
SourceEncodingUnresolved,
EssenceDescriptorListEmpty,
ContentVersionListEmpty,
ContentVersionIdInvalid,
ContentVersionLabelTextMissing,
LocaleLanguageTagInvalid,
TrackIdNotUnique,
MarkerOffsetOutOfRange,
MarkerLabelUnknown,
SegmentDuration,
ContentVersionIdDuplicate,
SegmentDurationIntegerEditUnits,
}
impl $name {
pub fn for_code(r: St2067_3Code) -> &'static str {
match r {
St2067_3Code::ContentKindUnknown => {
concat!($prefix, ":5.5.1.2/ContentKindUnknown")
}
St2067_3Code::SourceEncodingNoEssenceDescriptorList => {
concat!($prefix, ":6.4.2/SourceEncodingNoEssenceDescriptorList")
}
St2067_3Code::SourceEncodingUnresolved => {
concat!($prefix, ":6.4.2/SourceEncodingUnresolved")
}
St2067_3Code::EssenceDescriptorListEmpty => {
concat!($prefix, ":6.4.2/EssenceDescriptorListEmpty")
}
St2067_3Code::ContentVersionListEmpty => {
concat!($prefix, ":6.11/ContentVersionListEmpty")
}
St2067_3Code::ContentVersionIdInvalid => {
concat!($prefix, ":6.11/ContentVersionIdInvalid")
}
St2067_3Code::ContentVersionLabelTextMissing => {
concat!($prefix, ":6.11/ContentVersionLabelTextMissing")
}
St2067_3Code::LocaleLanguageTagInvalid => {
concat!($prefix, ":6.12/LocaleLanguageTagInvalid")
}
St2067_3Code::TrackIdNotUnique => concat!($prefix, ":7.3/TrackIdNotUnique"),
St2067_3Code::MarkerOffsetOutOfRange => {
concat!($prefix, ":7.4/MarkerOffsetOutOfRange")
}
St2067_3Code::MarkerLabelUnknown => concat!($prefix, ":7.4/MarkerLabelUnknown"),
St2067_3Code::SegmentDuration => concat!($prefix, ":7.2.2/SegmentDuration"),
St2067_3Code::ContentVersionIdDuplicate => {
concat!($prefix, ":6.1.9/ContentVersionIdDuplicate")
}
St2067_3Code::SegmentDurationIntegerEditUnits => {
concat!($prefix, ":7.3/SegmentDurationIntegerEditUnits")
}
}
}
pub const ALL: &'static [Self] = &[
Self::ContentKindUnknown,
Self::SourceEncodingNoEssenceDescriptorList,
Self::SourceEncodingUnresolved,
Self::EssenceDescriptorListEmpty,
Self::ContentVersionListEmpty,
Self::ContentVersionIdInvalid,
Self::ContentVersionLabelTextMissing,
Self::LocaleLanguageTagInvalid,
Self::TrackIdNotUnique,
Self::MarkerOffsetOutOfRange,
Self::MarkerLabelUnknown,
Self::SegmentDuration,
Self::ContentVersionIdDuplicate,
Self::SegmentDurationIntegerEditUnits,
];
}
impl ValidationCode for $name {
fn code(&self) -> &'static str {
match self {
Self::ContentKindUnknown => concat!($prefix, ":5.5.1.2/ContentKindUnknown"),
Self::SourceEncodingNoEssenceDescriptorList => {
concat!($prefix, ":6.4.2/SourceEncodingNoEssenceDescriptorList")
}
Self::SourceEncodingUnresolved => {
concat!($prefix, ":6.4.2/SourceEncodingUnresolved")
}
Self::EssenceDescriptorListEmpty => {
concat!($prefix, ":6.4.2/EssenceDescriptorListEmpty")
}
Self::ContentVersionListEmpty => {
concat!($prefix, ":6.11/ContentVersionListEmpty")
}
Self::ContentVersionIdInvalid => {
concat!($prefix, ":6.11/ContentVersionIdInvalid")
}
Self::ContentVersionLabelTextMissing => {
concat!($prefix, ":6.11/ContentVersionLabelTextMissing")
}
Self::LocaleLanguageTagInvalid => {
concat!($prefix, ":6.12/LocaleLanguageTagInvalid")
}
Self::TrackIdNotUnique => concat!($prefix, ":7.3/TrackIdNotUnique"),
Self::MarkerOffsetOutOfRange => concat!($prefix, ":7.4/MarkerOffsetOutOfRange"),
Self::MarkerLabelUnknown => concat!($prefix, ":7.4/MarkerLabelUnknown"),
Self::SegmentDuration => concat!($prefix, ":7.2.2/SegmentDuration"),
Self::ContentVersionIdDuplicate => {
concat!($prefix, ":6.1.9/ContentVersionIdDuplicate")
}
Self::SegmentDurationIntegerEditUnits => {
concat!($prefix, ":7.3/SegmentDurationIntegerEditUnits")
}
}
}
fn description(&self) -> &'static str {
match self {
Self::ContentKindUnknown => {
"ContentKind uses an unrecognized value under the SMPTE scope."
}
Self::SourceEncodingNoEssenceDescriptorList => {
"SourceEncoding present but EssenceDescriptorList absent."
}
Self::SourceEncodingUnresolved => {
"SourceEncoding does not match any EssenceDescriptor Id."
}
Self::EssenceDescriptorListEmpty => {
"EssenceDescriptorList present but contains no descriptors."
}
Self::ContentVersionListEmpty => "ContentVersionList present but empty.",
Self::ContentVersionIdInvalid => "ContentVersion/Id is empty (shall be a URI).",
Self::ContentVersionLabelTextMissing => "ContentVersion/LabelText is absent.",
Self::LocaleLanguageTagInvalid => {
"Locale language tag does not conform to RFC 5646."
}
Self::TrackIdNotUnique => "TrackId is not unique within a segment.",
Self::MarkerOffsetOutOfRange => {
"Marker offset exceeds resource effective duration."
}
Self::MarkerLabelUnknown => {
"Marker label is not a recognized SMPTE standard value."
}
Self::SegmentDuration => {
"All virtual tracks in a segment must span the same number of edit units."
}
Self::ContentVersionIdDuplicate => {
"No two ContentVersion elements shall have identical Id values."
}
Self::SegmentDurationIntegerEditUnits => {
"Sequence duration shall be an integer number of Composition Edit Units."
}
}
}
fn default_severity(&self) -> Severity {
match self {
Self::ContentKindUnknown => Severity::Warning,
Self::SourceEncodingNoEssenceDescriptorList => Severity::Error,
Self::SourceEncodingUnresolved => Severity::Error,
Self::EssenceDescriptorListEmpty => Severity::Error,
Self::ContentVersionListEmpty => Severity::Error,
Self::ContentVersionIdInvalid => Severity::Error,
Self::ContentVersionLabelTextMissing => Severity::Warning,
Self::LocaleLanguageTagInvalid => Severity::Warning,
Self::TrackIdNotUnique => Severity::Error,
Self::MarkerOffsetOutOfRange => Severity::Error,
Self::MarkerLabelUnknown => Severity::Warning,
Self::SegmentDuration => Severity::Error,
Self::ContentVersionIdDuplicate => Severity::Error,
Self::SegmentDurationIntegerEditUnits => Severity::Error,
}
}
fn category(&self) -> Category {
match self {
Self::ContentKindUnknown => Category::Metadata,
Self::SourceEncodingNoEssenceDescriptorList => Category::Reference,
Self::SourceEncodingUnresolved => Category::Reference,
Self::EssenceDescriptorListEmpty => Category::Structure,
Self::ContentVersionListEmpty => Category::Structure,
Self::ContentVersionIdInvalid => Category::Metadata,
Self::ContentVersionLabelTextMissing => Category::Metadata,
Self::LocaleLanguageTagInvalid => Category::Metadata,
Self::TrackIdNotUnique => Category::Structure,
Self::MarkerOffsetOutOfRange => Category::Timing,
Self::MarkerLabelUnknown => Category::Metadata,
Self::SegmentDuration => Category::Timing,
Self::ContentVersionIdDuplicate => Category::Structure,
Self::SegmentDurationIntegerEditUnits => Category::Timing,
}
}
}
impl From<$name> for String {
fn from(c: $name) -> String {
c.code().to_string()
}
}
};
}
define_st2067_3_enum!(St2067_3_2013, "ST2067-3:2013");
define_st2067_3_enum!(St2067_3_2016, "ST2067-3:2016");
define_st2067_3_enum!(St2067_3_2020, "ST2067-3:2020");