Skip to main content

unitforge/
errors.rs

1use core::fmt;
2
3#[derive(Clone, Copy, Debug, Eq, PartialEq)]
4pub enum UnitforgeError {
5    QuantityConversion(QuantityConversionError),
6    QuantityOperation(QuantityOperationError),
7    Linalg(LinalgError),
8}
9
10pub type UnitforgeResult<T> = Result<T, UnitforgeError>;
11
12impl fmt::Display for UnitforgeError {
13    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
14        match self {
15            UnitforgeError::QuantityConversion(err) => err.fmt(f),
16            UnitforgeError::QuantityOperation(err) => err.fmt(f),
17            UnitforgeError::Linalg(err) => err.fmt(f),
18        }
19    }
20}
21
22impl From<QuantityConversionError> for UnitforgeError {
23    fn from(value: QuantityConversionError) -> Self {
24        UnitforgeError::QuantityConversion(value)
25    }
26}
27
28impl From<QuantityOperationError> for UnitforgeError {
29    fn from(value: QuantityOperationError) -> Self {
30        UnitforgeError::QuantityOperation(value)
31    }
32}
33
34impl From<LinalgError> for UnitforgeError {
35    fn from(value: LinalgError) -> Self {
36        UnitforgeError::Linalg(value)
37    }
38}
39
40#[derive(Clone, Copy, Debug, Eq, PartialEq)]
41pub enum QuantityConversionError {
42    InvalidQuantityUnitPair,
43    InvalidQuantityExtraction,
44    InvalidPythonQuantity,
45    InvalidPythonUnit,
46    UnknownQuantityKindId { kind_id: u32 },
47    UnknownUnitKindId { kind_id: u32 },
48    UnknownUnitVariantId { kind_id: u32, variant_id: i32 },
49}
50
51pub type QuantityConversionResult<T> = Result<T, QuantityConversionError>;
52
53impl fmt::Display for QuantityConversionError {
54    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
55        match self {
56            QuantityConversionError::InvalidQuantityUnitPair => {
57                write!(f, "Cannot use given pair of quantity and unit")
58            }
59            QuantityConversionError::InvalidQuantityExtraction => {
60                write!(f, "Cannot extract requested quantity type")
61            }
62            QuantityConversionError::InvalidPythonQuantity => {
63                write!(f, "Cannot interpret given value as Quantity")
64            }
65            QuantityConversionError::InvalidPythonUnit => {
66                write!(f, "Cannot interpret given value as Unit")
67            }
68            QuantityConversionError::UnknownQuantityKindId { kind_id } => {
69                write!(f, "Unknown quantity kind id: {kind_id}")
70            }
71            QuantityConversionError::UnknownUnitKindId { kind_id } => {
72                write!(f, "Unknown unit kind id: {kind_id}")
73            }
74            QuantityConversionError::UnknownUnitVariantId {
75                kind_id,
76                variant_id,
77            } => write!(
78                f,
79                "Unknown unit variant id {variant_id} for unit kind id {kind_id}"
80            ),
81        }
82    }
83}
84
85#[derive(Clone, Copy, Debug, Eq, PartialEq)]
86pub enum QuantityOperationError {
87    AddError,
88    SubError,
89    MulError,
90    DivError,
91    ModError,
92    PowError,
93    SqrtError,
94    ComparisonError,
95}
96
97pub type QuantityOperationResult<T> = Result<T, QuantityOperationError>;
98
99impl fmt::Display for QuantityOperationError {
100    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
101        match self {
102            QuantityOperationError::AddError => write!(f, "Addition operation failed"),
103            QuantityOperationError::SubError => write!(f, "Subtraction operation failed"),
104            QuantityOperationError::MulError => write!(f, "Multiplication operation failed"),
105            QuantityOperationError::DivError => write!(f, "Division operation failed"),
106            QuantityOperationError::ModError => write!(f, "Modulo operation failed"),
107            QuantityOperationError::PowError => write!(f, "Power operation failed"),
108            QuantityOperationError::SqrtError => write!(f, "Sqrt operation failed"),
109            QuantityOperationError::ComparisonError => write!(f, "Comparison operation failed"),
110        }
111    }
112}
113
114#[derive(Clone, Copy, Debug, Eq, PartialEq)]
115pub enum LinalgShape {
116    Vector { len: usize },
117    Matrix { rows: usize, cols: usize },
118}
119
120impl fmt::Display for LinalgShape {
121    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
122        match self {
123            LinalgShape::Vector { len } => write!(f, "vector length {len}"),
124            LinalgShape::Matrix { rows, cols } => write!(f, "matrix shape {rows}x{cols}"),
125        }
126    }
127}
128
129#[derive(Clone, Copy, Debug, Eq, PartialEq)]
130pub enum LinalgError {
131    ShapeMismatch {
132        expected: LinalgShape,
133        actual: LinalgShape,
134    },
135    ShapeConstructionFailed,
136}
137
138pub type LinalgResult<T> = Result<T, LinalgError>;
139
140impl fmt::Display for LinalgError {
141    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
142        match self {
143            LinalgError::ShapeMismatch { expected, actual } => {
144                write!(f, "Shape mismatch: expected {expected}, got {actual}")
145            }
146            LinalgError::ShapeConstructionFailed => write!(f, "Shape construction failed"),
147        }
148    }
149}
150
151#[cfg(not(feature = "no_std"))]
152impl std::error::Error for UnitforgeError {}
153
154#[cfg(not(feature = "no_std"))]
155impl std::error::Error for QuantityConversionError {}
156
157#[cfg(not(feature = "no_std"))]
158impl std::error::Error for QuantityOperationError {}
159
160#[cfg(not(feature = "no_std"))]
161impl std::error::Error for LinalgError {}