Skip to main content

mediatek_optical/
error_codes.rs

1//! Stable identifiers for host diagnostics and translation keys.
2
3#[path = "issue_kind.rs"]
4mod issue_kind;
5use issue_kind::kind_for_code;
6
7/// A typed error with a stable, namespaced identifier.
8///
9/// Codes contain no runtime values. Match the error variant for parameters;
10/// `Display` is diagnostic prose and may change. Wrapper errors retain their
11/// own stage code; their typed causes describe the underlying failure.
12pub trait CodedError {
13    /// Protocol-neutral host guidance category; never derives from diagnostic prose.
14    fn kind(&self) -> crate::operation::IssueKind {
15        kind_for_code(self.code())
16    }
17    /// Stable identifier, such as `mediatek.receiver.changed`.
18    fn code(&self) -> &'static str;
19}
20
21impl CodedError for crate::protocol::Incomplete {
22    fn code(&self) -> &'static str {
23        "mediatek.protocol.incomplete"
24    }
25}
26
27impl CodedError for crate::UnknownChip {
28    fn code(&self) -> &'static str {
29        "mediatek.chip.unknown_label"
30    }
31}
32
33#[cfg(feature = "drive")]
34impl<E> CodedError for crate::drive::Error<E> {
35    fn code(&self) -> &'static str {
36        match self {
37            Self::Transport(_) => "mediatek.drive.transport",
38            Self::Short { .. } => "mediatek.drive.short",
39            Self::Oversize(_) => "mediatek.drive.oversize",
40        }
41    }
42}
43
44#[cfg(feature = "enc")]
45impl CodedError for crate::enc::LengthError {
46    fn code(&self) -> &'static str {
47        "mediatek.enc.length"
48    }
49}
50
51#[cfg(feature = "image")]
52impl CodedError for crate::image::ChipError {
53    fn code(&self) -> &'static str {
54        match self {
55            Self::Undetectable => "mediatek.image.undetectable_chip",
56        }
57    }
58}
59
60#[cfg(feature = "image")]
61impl CodedError for crate::image::cmac::CmacError {
62    fn code(&self) -> &'static str {
63        match self {
64            Self::ImageTooSmall { .. } => "mediatek.cmac.image_too_small",
65            Self::BadRange { .. } => "mediatek.cmac.bad_range",
66        }
67    }
68}
69
70#[cfg(feature = "image")]
71impl CodedError for crate::update::PrepareError {
72    fn code(&self) -> &'static str {
73        match self {
74            Self::ReceiverEntry => "mediatek.prepare.receiver_entry",
75            Self::ReceiverContract => "mediatek.prepare.receiver_contract",
76            #[cfg(all(feature = "drive", feature = "enc"))]
77            Self::Layout(_) => "mediatek.prepare.layout",
78            Self::Size(_) => "mediatek.prepare.size",
79            Self::Integrity => "mediatek.prepare.integrity",
80            Self::DriveRead => "mediatek.prepare.drive_read",
81            Self::UnknownChip => "mediatek.prepare.unknown_chip",
82            Self::UnknownDriveChip => "mediatek.prepare.unknown_drive_chip",
83            Self::ChipMismatch { .. } => "mediatek.prepare.chip_mismatch",
84            Self::InstalledMismatch => "mediatek.prepare.installed_mismatch",
85            Self::UnknownInstalledFamily => "mediatek.prepare.unknown_installed_family",
86            Self::UnknownTargetFamily => "mediatek.prepare.unknown_target_family",
87            Self::FamilyMismatch { .. } => "mediatek.prepare.family_mismatch",
88        }
89    }
90}
91
92#[cfg(all(feature = "image", feature = "enc"))]
93impl CodedError for crate::envelope::Error {
94    fn code(&self) -> &'static str {
95        match self {
96            Self::Image(_) => "mediatek.envelope.image",
97            Self::UnknownFraming => "mediatek.envelope.unknown_framing",
98            Self::Ambiguous => "mediatek.envelope.ambiguous",
99        }
100    }
101}
102
103#[cfg(feature = "oem")]
104impl CodedError for crate::oem::RebuildError {
105    fn code(&self) -> &'static str {
106        match self {
107            Self::Size(_) => "mediatek.oem.size",
108            Self::Chip(_) => "mediatek.oem.chip",
109            Self::NoFactory(_) => "mediatek.oem.no_factory",
110            Self::UnknownBootPage(_) => "mediatek.oem.unknown_boot_page",
111            Self::Factory(_) => "mediatek.oem.factory",
112        }
113    }
114}
115
116#[cfg(feature = "drive")]
117impl<E> CodedError for crate::receiver::Error<E> {
118    fn code(&self) -> &'static str {
119        match self {
120            Self::Read(_) => "mediatek.receiver.read",
121            Self::InvalidIdentity => "mediatek.receiver.invalid_identity",
122            Self::Unknown => "mediatek.receiver.unknown",
123            Self::Conflict => "mediatek.receiver.conflict",
124            Self::Changed => "mediatek.receiver.changed",
125            Self::UnknownEntry => "mediatek.receiver.unknown_entry",
126        }
127    }
128}
129
130#[cfg(all(feature = "drive", feature = "image"))]
131impl<E> CodedError for crate::update::FlashError<E> {
132    fn code(&self) -> &'static str {
133        match self {
134            Self::Entry(_) => "mediatek.flash.entry",
135            Self::Transfer { .. } => "mediatek.flash.transfer",
136            Self::Fault { .. } => "mediatek.flash.fault",
137            Self::ReadyTimeout(_) => "mediatek.flash.ready_timeout",
138            Self::Startup(_) => "mediatek.flash.startup",
139            Self::Mismatch { .. } => "mediatek.flash.mismatch",
140            Self::Incomplete { .. } => "mediatek.flash.incomplete",
141        }
142    }
143}
144
145#[cfg(all(feature = "drive", feature = "image"))]
146impl<E> CodedError for crate::update::StartupError<E> {
147    fn code(&self) -> &'static str {
148        match self {
149            Self::Identity(_) => "mediatek.startup.identity",
150            Self::Read(_) => "mediatek.startup.read",
151            Self::TargetMismatch => "mediatek.startup.target_mismatch",
152        }
153    }
154}
155
156#[cfg(all(feature = "drive", feature = "image", feature = "enc"))]
157impl<E> CodedError for crate::receiver::ExecuteError<E> {
158    fn code(&self) -> &'static str {
159        match self {
160            Self::Receiver(_) => "mediatek.execute.receiver",
161            Self::Flash(_) => "mediatek.execute.flash",
162        }
163    }
164}
165
166#[cfg(all(feature = "drive", feature = "image", feature = "enc"))]
167impl<E> CodedError for crate::receiver::reference::Error<E> {
168    fn kind(&self) -> crate::operation::IssueKind {
169        match self {
170            Self::Analysis(error) => error.kind(),
171            Self::Binding(error) => error.kind(),
172        }
173    }
174    fn code(&self) -> &'static str {
175        match self {
176            Self::Analysis(_) => "mediatek.reference.analysis",
177            Self::Binding(_) => "mediatek.reference.binding",
178        }
179    }
180}
181
182#[cfg(all(feature = "drive", feature = "image", feature = "enc"))]
183impl CodedError for crate::receiver::layout::Error {
184    fn code(&self) -> &'static str {
185        match self {
186            Self::Alignment => "mediatek.layout.alignment",
187            Self::Range => "mediatek.layout.range",
188            Self::Conflict { .. } => "mediatek.layout.conflict",
189            Self::MultipleDecryptions { .. } => "mediatek.layout.multiple_decryptions",
190            Self::NoProgram => "mediatek.layout.no_program",
191            Self::ImageSize => "mediatek.layout.image_size",
192        }
193    }
194}
195
196#[cfg(all(feature = "drive", feature = "image", feature = "enc"))]
197impl<E> CodedError for crate::recovery::Error<E> {
198    fn kind(&self) -> crate::operation::IssueKind {
199        use crate::operation::IssueKind;
200        match self {
201            Self::Receiver(error) => error.kind(),
202            Self::Reference(error) => error.kind(),
203            Self::Read(error) => error.kind(),
204            Self::Image(error) => error.kind(),
205            Self::Flash(error) => error.kind(),
206            Self::Changed => IssueKind::ReceiverMismatch,
207            Self::Startup(error) => error.kind(),
208        }
209    }
210    fn code(&self) -> &'static str {
211        match self {
212            Self::Receiver(_) => "mediatek.recovery.receiver",
213            Self::Reference(_) => "mediatek.recovery.reference",
214            Self::Read(_) => "mediatek.recovery.read",
215            Self::Image(_) => "mediatek.recovery.image",
216            Self::Flash(_) => "mediatek.recovery.flash",
217            Self::Changed => "mediatek.recovery.changed",
218            Self::Startup(_) => "mediatek.recovery.startup",
219        }
220    }
221}