Skip to main content

smart_package_tracker/
error.rs

1//! Error types for this crate.
2
3use alloc::string::String;
4
5/// Convenience alias for results produced by this crate.
6pub type Result<T> = core::result::Result<T, Error>;
7
8/// Everything that can go wrong in this crate.
9///
10/// This enum is `#[non_exhaustive]`: new variants may be added in minor
11/// releases, so always include a `_` arm when matching.
12#[derive(Debug, thiserror::Error)]
13#[non_exhaustive]
14pub enum Error {
15    /// A string did not have the shape of a tracking ID.
16    #[error("malformed tracking id: {reason}")]
17    InvalidTrackingId {
18        /// Human-readable explanation of what failed validation.
19        reason: String,
20    },
21
22    /// A tracking ID was structurally valid but did not match the policy of
23    /// the [`IdGenerator`](crate::IdGenerator) it was checked against.
24    #[error("tracking id does not match generator policy: {reason}")]
25    IdPolicyMismatch {
26        /// Human-readable explanation of the mismatch.
27        reason: String,
28    },
29
30    /// [`IdGenerator::builder`](crate::IdGenerator::builder) was given
31    /// contradictory or out-of-range settings.
32    #[error("invalid id generator configuration: {0}")]
33    InvalidIdConfig(String),
34
35    /// The operating system's randomness source was unavailable.
36    #[error("could not read from the system entropy source: {0}")]
37    Entropy(String),
38
39    /// The caller-supplied entropy buffer was too small for the requested
40    /// number of bits.
41    #[error("need at least {needed} bytes of entropy, got {got}")]
42    InsufficientEntropy {
43        /// Bytes required for the configured entropy width.
44        needed: usize,
45        /// Bytes actually supplied.
46        got: usize,
47    },
48
49    /// The payload cannot be represented in the requested symbology.
50    #[error("data cannot be encoded as {symbology}: {reason}")]
51    Unencodable {
52        /// Name of the symbology that rejected the payload.
53        symbology: &'static str,
54        /// Why the payload was rejected.
55        reason: String,
56    },
57
58    /// Symbologies in this crate reject empty payloads.
59    #[error("cannot encode an empty payload")]
60    EmptyPayload,
61
62    /// [`RenderOptions`](crate::RenderOptions) were internally inconsistent or
63    /// would produce a degenerate image.
64    #[error("invalid render options: {0}")]
65    InvalidRenderOptions(String),
66
67    /// The renderer failed while producing output.
68    #[error("rendering failed: {0}")]
69    Render(String),
70
71    /// A barcode could not be decoded back into a payload.
72    #[error("decoding failed: {0}")]
73    Decode(String),
74
75    /// An image could not be interpreted as a pixel buffer.
76    #[error("invalid image: {0}")]
77    InvalidImage(String),
78
79    /// [`Scanner`](crate::scan::Scanner) found no readable barcode. A barcode
80    /// that is present but unreadable is indistinguishable from one that is
81    /// absent, so both report this.
82    #[error("no barcode found: {0}")]
83    NoSymbolFound(String),
84
85    /// An I/O error from one of the `*_to_file` helpers.
86    #[cfg(feature = "std")]
87    #[error("i/o error: {0}")]
88    Io(#[from] std::io::Error),
89}