Skip to main content

mlt_core/frames/v01/
compare.rs

1/// Cross-type [`PartialEq`] between decode-side (`Parsed*` / `Layer01<'a>`) and
2/// encode-side (`Staged*`) types.
3///
4/// These implementations allow round-trip tests to compare a decoded tile
5/// directly against a hand-crafted `Staged*` value without having to convert
6/// one side first.
7use crate::frames::model::{EncodedUnknown, Layer, StagedLayer, Unknown};
8use crate::v01::{
9    Geometry, GeometryValues, Id, IdValues, Layer01, Property, StagedLayer01, StagedProperty,
10};
11
12// ── Id ────────────────────────────────────────────────────────────────────────
13
14impl PartialEq<IdValues> for Id<'_> {
15    fn eq(&self, other: &IdValues) -> bool {
16        match self {
17            Self::Parsed(parsed) => parsed == other,
18            Self::Raw(_) | Self::ParsingFailed => false,
19        }
20    }
21}
22
23impl PartialEq<Id<'_>> for IdValues {
24    fn eq(&self, other: &Id<'_>) -> bool {
25        other == self
26    }
27}
28
29// ── Geometry ──────────────────────────────────────────────────────────────────
30
31impl PartialEq<GeometryValues> for Geometry<'_> {
32    fn eq(&self, other: &GeometryValues) -> bool {
33        match self {
34            Self::Parsed(parsed) => parsed == other,
35            Self::Raw(_) | Self::ParsingFailed => false,
36        }
37    }
38}
39
40impl PartialEq<Geometry<'_>> for GeometryValues {
41    fn eq(&self, other: &Geometry<'_>) -> bool {
42        other == self
43    }
44}
45
46// ── Property ──────────────────────────────────────────────────────────────────
47
48impl PartialEq<StagedProperty> for Property<'_> {
49    fn eq(&self, other: &StagedProperty) -> bool {
50        match self {
51            Self::Parsed(parsed) => parsed == other,
52            Self::Raw(_) | Self::ParsingFailed => false,
53        }
54    }
55}
56
57impl PartialEq<Property<'_>> for StagedProperty {
58    fn eq(&self, other: &Property<'_>) -> bool {
59        other == self
60    }
61}
62
63// ── Layer01 ───────────────────────────────────────────────────────────────────
64
65impl PartialEq<StagedLayer01> for Layer01<'_> {
66    fn eq(&self, other: &StagedLayer01) -> bool {
67        let Self {
68            name,
69            extent,
70            id,
71            geometry,
72            properties,
73            #[cfg(fuzzing)]
74                layer_order: _,
75        } = self;
76        let StagedLayer01 {
77            name: other_name,
78            extent: other_extent,
79            id: other_id,
80            geometry: other_geometry,
81            properties: other_properties,
82        } = other;
83        name == other_name
84            && extent == other_extent
85            && id.as_ref().map_or(other_id.is_none(), |id| {
86                other_id.as_ref().is_some_and(|oid| id == oid)
87            })
88            && geometry == other_geometry
89            && properties.len() == other_properties.len()
90            && properties.iter().zip(other_properties).all(|(a, b)| a == b)
91    }
92}
93
94impl PartialEq<Layer01<'_>> for StagedLayer01 {
95    fn eq(&self, other: &Layer01<'_>) -> bool {
96        other == self
97    }
98}
99
100// ── Unknown ───────────────────────────────────────────────────────────────────
101
102impl PartialEq<EncodedUnknown> for Unknown<'_> {
103    fn eq(&self, other: &EncodedUnknown) -> bool {
104        let Self { tag, value } = self;
105        let EncodedUnknown {
106            tag: other_tag,
107            value: other_value,
108        } = other;
109        tag == other_tag && *value == other_value.as_slice()
110    }
111}
112
113impl PartialEq<Unknown<'_>> for EncodedUnknown {
114    fn eq(&self, other: &Unknown<'_>) -> bool {
115        other == self
116    }
117}
118
119// ── Layer ─────────────────────────────────────────────────────────────────────
120
121impl PartialEq<StagedLayer> for Layer<'_> {
122    fn eq(&self, other: &StagedLayer) -> bool {
123        match (self, other) {
124            (Self::Tag01(a), StagedLayer::Tag01(b)) => a == b,
125            (Self::Unknown(a), StagedLayer::Unknown(b)) => a == b,
126            _ => false,
127        }
128    }
129}
130
131impl PartialEq<Layer<'_>> for StagedLayer {
132    fn eq(&self, other: &Layer<'_>) -> bool {
133        other == self
134    }
135}