update/
error.rs

1// SPDX-FileCopyrightText: 2025 Foundation Devices, Inc. <hello@foundation.xyz>
2// SPDX-License-Identifier: GPL-3.0-or-later
3
4#[derive(Clone, Debug, thiserror::Error, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
5pub enum Error {
6    #[error("failed to reboot")]
7    Reboot,
8    #[error("no update downloaded")]
9    NoUpdateDownloaded,
10    #[error("io error: {0}")]
11    Io(String),
12    #[error(transparent)]
13    Fs(#[from] fs::Error),
14    #[error("failed to parse version string {0}")]
15    ParseVersion(String),
16    #[error("patch version mismatch")]
17    PatchVersionMismatch,
18    #[error("patch file ({file_name}) size mismatch, expected = {expected_size}, actual = {actual_size}")]
19    PatchSizeMismatch { file_name: String, expected_size: u64, actual_size: u64 },
20    #[error("patch file hash mismatch")]
21    PatchHashMismatch,
22    #[error("bsdiff patch failed: {0}")]
23    Bsdiff(String),
24    #[error("cosign2 error: {0}")]
25    Cosign2(String),
26    #[error("cosign2 header missing")]
27    Cosign2HeaderMissing,
28    #[error("crypto error")]
29    CryptoError(#[from] crypto::error::CryptoError),
30    #[error("security error")]
31    SecurityError,
32    #[error("invalid manifest")]
33    InvalidManifest,
34    #[error("unexpected error")]
35    Unexpected(String),
36    #[error("insufficient battery level for update")]
37    InsufficientBattery,
38    #[error("firmware rollback prevented: current timestamp = {current}, update timestamp = {update}")]
39    RollbackPrevented { current: u32, update: u32 },
40}
41
42impl From<std::io::Error> for Error {
43    fn from(e: std::io::Error) -> Self { Error::Io(e.to_string()) }
44}
45
46#[derive(Clone, Debug, thiserror::Error, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
47pub enum DownloadError {
48    #[error("io error: {0}")]
49    Io(String),
50    #[error(transparent)]
51    Fs(#[from] fs::Error),
52    #[error("envoy error: {0}")]
53    EnvoyError(String),
54    #[error("retry request failed: {0}")]
55    RetryFailed(String),
56    #[error("invalid state")]
57    InvalidState,
58    #[error("invalid chunk")]
59    InvalidChunk,
60    #[error("download stalled")]
61    Stalled,
62}
63
64impl From<std::io::Error> for DownloadError {
65    fn from(e: std::io::Error) -> Self { DownloadError::Io(e.to_string()) }
66}