Skip to main content

spatialrust_vision/
error.rs

1use spatialrust_image::ImageError;
2
3/// Result type for image and vision operations.
4pub type VisionResult<T> = Result<T, VisionError>;
5
6/// Errors raised by image and vision algorithms.
7#[derive(Clone, Debug, PartialEq, thiserror::Error)]
8pub enum VisionError {
9    /// Image construction or layout validation failed.
10    #[error(transparent)]
11    Image(#[from] ImageError),
12    /// An operation received unusable image dimensions.
13    #[error("invalid image dimensions: {0}")]
14    InvalidDimensions(String),
15    /// A numeric parameter was invalid.
16    #[error("invalid parameter: {0}")]
17    InvalidParameter(String),
18    /// Input collections or maps had incompatible shapes.
19    #[error("shape mismatch: {0}")]
20    ShapeMismatch(String),
21    /// A descriptor buffer does not match its declared row layout.
22    #[error("descriptor layout {rows}x{width} requires {expected} values, found {actual}")]
23    DescriptorLayout {
24        /// Descriptor row count.
25        rows: usize,
26        /// Values or bytes per descriptor.
27        width: usize,
28        /// Required flat storage length.
29        expected: usize,
30        /// Supplied flat storage length.
31        actual: usize,
32    },
33    /// Keypoint and descriptor row counts differ.
34    #[error("feature set has {keypoints} keypoints but {descriptors} descriptor rows")]
35    FeatureCountMismatch {
36        /// Number of keypoints.
37        keypoints: usize,
38        /// Number of descriptors.
39        descriptors: usize,
40    },
41    /// A feature match references a keypoint outside its collection.
42    #[error(
43        "feature match index is out of bounds: query {query}/{queries}, train {train}/{trains}"
44    )]
45    MatchIndexOutOfBounds {
46        /// Query index.
47        query: usize,
48        /// Query feature count.
49        queries: usize,
50        /// Train index.
51        train: usize,
52        /// Train feature count.
53        trains: usize,
54    },
55    /// Inlier and residual arrays do not match the correspondence count.
56    #[error(
57        "geometry result for {correspondences} correspondences has {inliers} inlier flags and {residuals} residuals"
58    )]
59    GeometryResultLayout {
60        /// Number of input correspondences.
61        correspondences: usize,
62        /// Number of inlier flags.
63        inliers: usize,
64        /// Number of residual values.
65        residuals: usize,
66    },
67    /// A geometric transform could not be inverted.
68    #[error("transform is singular")]
69    SingularTransform,
70}