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 {}