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 HeistCancelledDifferentShapes {
181 src_shape: &'static Shape,
183 dst_shape: &'static Shape,
185 },
186
187 #[cfg(feature = "alloc")]
188 CustomDeserializationError {
190 message: alloc::string::String,
192 src_shape: &'static Shape,
194 dst_shape: &'static Shape,
196 },
197
198 #[cfg(feature = "alloc")]
199 CustomSerializationError {
201 message: alloc::string::String,
203 src_shape: &'static Shape,
205 dst_shape: &'static Shape,
207 },
208}
209
210impl core::fmt::Display for ReflectError {
211 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
212 match self {
213 ReflectError::NoSuchVariant { enum_type } => {
214 write!(f, "No such variant in enum. Known variants: ")?;
215 for v in enum_type.variants {
216 write!(f, ", {}", v.name)?;
217 }
218 write!(f, ", that's it.")
219 }
220 ReflectError::WrongShape { expected, actual } => {
221 write!(f, "Wrong shape: expected {expected}, but got {actual}")
222 }
223 ReflectError::WasNotA { expected, actual } => {
224 write!(f, "Wrong shape: expected {expected}, but got {actual}")
225 }
226 ReflectError::UninitializedField { shape, field_name } => {
227 write!(f, "Field '{shape}::{field_name}' was not initialized")
228 }
229 ReflectError::UninitializedEnumField {
230 shape,
231 field_name,
232 variant_name,
233 } => {
234 write!(
235 f,
236 "Field '{shape}::{field_name}' in variant '{variant_name}' was not initialized"
237 )
238 }
239 ReflectError::UninitializedValue { shape } => {
240 write!(f, "Value '{shape}' was not initialized")
241 }
242 ReflectError::InvariantViolation { invariant } => {
243 write!(f, "Invariant violation: {invariant}")
244 }
245 ReflectError::MissingCharacteristic {
246 shape,
247 characteristic,
248 } => write!(
249 f,
250 "{shape} does not implement characteristic {characteristic:?}",
251 ),
252 ReflectError::OperationFailed { shape, operation } => {
253 write!(f, "Operation failed on shape {shape}: {operation}")
254 }
255 ReflectError::FieldError { shape, field_error } => {
256 write!(f, "Field error for shape {shape}: {field_error}")
257 }
258 ReflectError::MissingPushPointee { shape } => {
259 write!(
260 f,
261 "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)"
262 )
263 }
264 ReflectError::Unknown => write!(f, "Unknown error"),
265 ReflectError::TryFromError {
266 src_shape,
267 dst_shape,
268 inner,
269 } => {
270 write!(
271 f,
272 "While trying to put {src_shape} into a {dst_shape}: {inner}"
273 )
274 }
275 ReflectError::DefaultAttrButNoDefaultImpl { shape } => write!(
276 f,
277 "Shape '{shape}' has a `default` attribute but no default implementation"
278 ),
279 ReflectError::Unsized { shape, operation } => write!(
280 f,
281 "Shape '{shape}' is unsized, can't perform operation {operation}"
282 ),
283 ReflectError::ArrayNotFullyInitialized {
284 shape,
285 pushed_count,
286 expected_size,
287 } => {
288 write!(
289 f,
290 "Array '{shape}' not fully initialized: expected {expected_size} elements, but got {pushed_count}"
291 )
292 }
293 ReflectError::ArrayIndexOutOfBounds { shape, index, size } => {
294 write!(
295 f,
296 "Array index {index} out of bounds for '{shape}' (array length is {size})"
297 )
298 }
299 ReflectError::InvalidOperation { operation, reason } => {
300 write!(f, "Invalid operation '{operation}': {reason}")
301 }
302 ReflectError::UnexpectedTracker {
303 message,
304 current_tracker,
305 } => {
306 write!(f, "{message}: current tracker is {current_tracker:?}")
307 }
308 ReflectError::NoActiveFrame => {
309 write!(f, "No active frame in Partial")
310 }
311 ReflectError::HeistCancelledDifferentShapes {
312 src_shape,
313 dst_shape,
314 } => {
315 write!(
316 f,
317 "Tried to steal_nth_field from {src_shape} into {dst_shape}"
318 )
319 }
320 #[cfg(feature = "alloc")]
321 ReflectError::CustomDeserializationError {
322 message,
323 src_shape,
324 dst_shape,
325 } => {
326 write!(
327 f,
328 "Custom deserialization of shape '{src_shape}' into '{dst_shape}' failed: {message}"
329 )
330 }
331 #[cfg(feature = "alloc")]
332 ReflectError::CustomSerializationError {
333 message,
334 src_shape,
335 dst_shape,
336 } => {
337 write!(
338 f,
339 "Custom serialization of shape '{src_shape}' into '{dst_shape}' failed: {message}"
340 )
341 }
342 }
343 }
344}
345
346impl core::fmt::Debug for ReflectError {
347 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
348 write!(f, "ReflectError({self})")
350 }
351}
352
353impl core::error::Error for ReflectError {}