1use facet_core::{Characteristic, EnumType, FieldError, Shape, TryFromError};
2
3#[allow(missing_docs)]
5#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
6#[non_exhaustive]
7pub enum TrackerKind {
8 Uninit,
9 Init,
10 Array,
11 Struct,
12 SmartPointer,
13 SmartPointerSlice,
14 Enum,
15 List,
16 Map,
17 Option,
18}
19
20#[derive(Clone)]
22pub enum ReflectError {
23 NoSuchVariant {
25 enum_type: EnumType,
27 },
28
29 WrongShape {
32 expected: &'static Shape,
34 actual: &'static Shape,
36 },
37
38 WasNotA {
40 expected: &'static str,
42
43 actual: &'static Shape,
45 },
46
47 UninitializedField {
49 shape: &'static Shape,
51 field_name: &'static str,
53 },
54
55 UninitializedEnumField {
57 shape: &'static Shape,
59 field_name: &'static str,
61 variant_name: &'static str,
63 },
64
65 UninitializedValue {
67 shape: &'static Shape,
69 },
70
71 InvariantViolation {
73 invariant: &'static str,
75 },
76
77 MissingCharacteristic {
79 shape: &'static Shape,
81 characteristic: Characteristic,
83 },
84
85 OperationFailed {
87 shape: &'static Shape,
89 operation: &'static str,
91 },
92
93 FieldError {
95 shape: &'static Shape,
97 field_error: FieldError,
99 },
100
101 MissingPushPointee {
104 shape: &'static Shape,
106 },
107
108 Unknown,
110
111 TryFromError {
113 src_shape: &'static Shape,
115
116 dst_shape: &'static Shape,
118
119 inner: TryFromError,
121 },
122
123 DefaultAttrButNoDefaultImpl {
125 shape: &'static Shape,
127 },
128
129 Unsized {
131 shape: &'static Shape,
133 operation: &'static str,
135 },
136
137 ArrayNotFullyInitialized {
139 shape: &'static Shape,
141 pushed_count: usize,
143 expected_size: usize,
145 },
146
147 ArrayIndexOutOfBounds {
149 shape: &'static Shape,
151 index: usize,
153 size: usize,
155 },
156
157 InvalidOperation {
159 operation: &'static str,
161 reason: &'static str,
163 },
164
165 UnexpectedTracker {
167 message: &'static str,
170
171 current_tracker: TrackerKind,
173 },
174
175 NoActiveFrame,
177}
178
179impl core::fmt::Display for ReflectError {
180 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
181 match self {
182 ReflectError::NoSuchVariant { enum_type } => {
183 write!(f, "No such variant in enum. Known variants: ")?;
184 for v in enum_type.variants {
185 write!(f, ", {}", v.name)?;
186 }
187 write!(f, ", that's it.")
188 }
189 ReflectError::WrongShape { expected, actual } => {
190 write!(f, "Wrong shape: expected {expected}, but got {actual}")
191 }
192 ReflectError::WasNotA { expected, actual } => {
193 write!(f, "Wrong shape: expected {expected}, but got {actual}")
194 }
195 ReflectError::UninitializedField { shape, field_name } => {
196 write!(f, "Field '{shape}::{field_name}' was not initialized")
197 }
198 ReflectError::UninitializedEnumField {
199 shape,
200 field_name,
201 variant_name,
202 } => {
203 write!(
204 f,
205 "Field '{shape}::{field_name}' in variant '{variant_name}' was not initialized"
206 )
207 }
208 ReflectError::UninitializedValue { shape } => {
209 write!(f, "Value '{shape}' was not initialized")
210 }
211 ReflectError::InvariantViolation { invariant } => {
212 write!(f, "Invariant violation: {invariant}")
213 }
214 ReflectError::MissingCharacteristic {
215 shape,
216 characteristic,
217 } => write!(
218 f,
219 "{shape} does not implement characteristic {characteristic:?}",
220 ),
221 ReflectError::OperationFailed { shape, operation } => {
222 write!(f, "Operation failed on shape {shape}: {operation}")
223 }
224 ReflectError::FieldError { shape, field_error } => {
225 write!(f, "Field error for shape {shape}: {field_error}")
226 }
227 ReflectError::MissingPushPointee { shape } => {
228 write!(
229 f,
230 "Tried to access a field on smart pointer '{shape}', but you need to call .begin_smart_ptr() first to work with the value it points to (and pop it with .pop() later)"
231 )
232 }
233 ReflectError::Unknown => write!(f, "Unknown error"),
234 ReflectError::TryFromError {
235 src_shape,
236 dst_shape,
237 inner,
238 } => {
239 write!(
240 f,
241 "While trying to put {src_shape} into a {dst_shape}: {inner}"
242 )
243 }
244 ReflectError::DefaultAttrButNoDefaultImpl { shape } => write!(
245 f,
246 "Shape '{shape}' has a `default` attribute but no default implementation"
247 ),
248 ReflectError::Unsized { shape, operation } => write!(
249 f,
250 "Shape '{shape}' is unsized, can't perform operation {operation}"
251 ),
252 ReflectError::ArrayNotFullyInitialized {
253 shape,
254 pushed_count,
255 expected_size,
256 } => {
257 write!(
258 f,
259 "Array '{shape}' not fully initialized: expected {expected_size} elements, but got {pushed_count}"
260 )
261 }
262 ReflectError::ArrayIndexOutOfBounds { shape, index, size } => {
263 write!(
264 f,
265 "Array index {index} out of bounds for '{shape}' (array length is {size})"
266 )
267 }
268 ReflectError::InvalidOperation { operation, reason } => {
269 write!(f, "Invalid operation '{operation}': {reason}")
270 }
271 ReflectError::UnexpectedTracker {
272 message,
273 current_tracker,
274 } => {
275 write!(f, "{message}: current tracker is {current_tracker:?}")
276 }
277 ReflectError::NoActiveFrame => {
278 write!(f, "No active frame in Partial")
279 }
280 }
281 }
282}
283
284impl core::fmt::Debug for ReflectError {
285 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
286 write!(f, "ReflectError({self})")
288 }
289}
290
291impl core::error::Error for ReflectError {}