Skip to main content

json_structure/
error_codes.rs

1//! Error codes for JSON Structure validation.
2//!
3//! These error codes match the standardized codes in `assets/error-messages.json`.
4
5use std::fmt;
6
7/// Error codes for schema validation errors.
8///
9/// This enum is marked `#[non_exhaustive]` to allow adding new error codes
10/// in future versions without breaking semver compatibility.
11#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
12#[non_exhaustive]
13pub enum SchemaErrorCode {
14    // General schema errors
15    SchemaNull,
16    SchemaInvalidType,
17    SchemaRootMissingId,
18    SchemaRootMissingName,
19    SchemaRootMissingSchema,
20    SchemaRootMissingType,
21    
22    // Type errors
23    SchemaTypeInvalid,
24    SchemaTypeNotString,
25    
26    // Reference errors
27    SchemaRefNotFound,
28    SchemaRefNotString,
29    SchemaRefCircular,
30    SchemaRefInvalid,
31    
32    // Definition errors
33    SchemaDefinitionsMustBeObject,
34    SchemaDefinitionMissingType,
35    SchemaDefinitionInvalid,
36    
37    // Object property errors
38    SchemaPropertiesMustBeObject,
39    SchemaPropertyInvalid,
40    SchemaRequiredMustBeArray,
41    SchemaRequiredItemMustBeString,
42    SchemaRequiredPropertyNotDefined,
43    SchemaAdditionalPropertiesInvalid,
44    
45    // Array/Set errors
46    SchemaArrayMissingItems,
47    SchemaItemsInvalid,
48    
49    // Map errors
50    SchemaMapMissingValues,
51    SchemaValuesInvalid,
52    
53    // Tuple errors
54    SchemaTupleMissingDefinition,
55    SchemaTupleMissingProperties,
56    SchemaTupleInvalidFormat,
57    SchemaTuplePropertyNotDefined,
58    
59    // Choice errors
60    SchemaChoiceMissingChoices,
61    SchemaChoicesNotObject,
62    SchemaChoiceInvalid,
63    SchemaSelectorNotString,
64    
65    // Enum/Const errors
66    SchemaEnumNotArray,
67    SchemaEnumEmpty,
68    SchemaEnumDuplicates,
69    SchemaConstInvalid,
70    
71    // Extension errors
72    SchemaUsesNotArray,
73    SchemaUsesInvalidExtension,
74    SchemaOffersNotArray,
75    SchemaOffersInvalidExtension,
76    SchemaExtensionKeywordWithoutUses,
77    
78    // Constraint errors
79    SchemaMinMaxInvalid,
80    SchemaMinLengthInvalid,
81    SchemaMaxLengthInvalid,
82    SchemaPatternInvalid,
83    SchemaFormatInvalid,
84    SchemaConstraintTypeMismatch,
85    SchemaMinimumExceedsMaximum,
86    SchemaMinLengthExceedsMaxLength,
87    SchemaMinLengthNegative,
88    SchemaMaxLengthNegative,
89    SchemaMinItemsExceedsMaxItems,
90    SchemaMinItemsNegative,
91    SchemaMultipleOfInvalid,
92    SchemaKeywordInvalidType,
93    SchemaTypeArrayEmpty,
94    SchemaTypeObjectMissingRef,
95    
96    // Import errors
97    SchemaImportNotAllowed,
98    SchemaImportFailed,
99    SchemaImportCircular,
100    
101    // Extends errors
102    SchemaExtendsNotString,
103    SchemaExtendsEmpty,
104    SchemaExtendsNotFound,
105    SchemaExtendsCircular,
106    
107    // Altnames errors
108    SchemaAltnamesNotObject,
109    SchemaAltnamesValueNotString,
110    
111    // Composition errors
112    SchemaAllOfNotArray,
113    SchemaAnyOfNotArray,
114    SchemaOneOfNotArray,
115    SchemaNotInvalid,
116    SchemaIfInvalid,
117    SchemaThenWithoutIf,
118    SchemaElseWithoutIf,
119}
120
121impl SchemaErrorCode {
122    /// Returns the string code for this error.
123    pub fn as_str(&self) -> &'static str {
124        match self {
125            Self::SchemaNull => "SCHEMA_NULL",
126            Self::SchemaInvalidType => "SCHEMA_INVALID_TYPE",
127            Self::SchemaRootMissingId => "SCHEMA_ROOT_MISSING_ID",
128            Self::SchemaRootMissingName => "SCHEMA_ROOT_MISSING_NAME",
129            Self::SchemaRootMissingSchema => "SCHEMA_ROOT_MISSING_SCHEMA",
130            Self::SchemaRootMissingType => "SCHEMA_ROOT_MISSING_TYPE",
131            Self::SchemaTypeInvalid => "SCHEMA_TYPE_INVALID",
132            Self::SchemaTypeNotString => "SCHEMA_TYPE_NOT_STRING",
133            Self::SchemaRefNotFound => "SCHEMA_REF_NOT_FOUND",
134            Self::SchemaRefNotString => "SCHEMA_REF_NOT_STRING",
135            Self::SchemaRefCircular => "SCHEMA_REF_CIRCULAR",
136            Self::SchemaRefInvalid => "SCHEMA_REF_INVALID",
137            Self::SchemaDefinitionsMustBeObject => "SCHEMA_DEFINITIONS_MUST_BE_OBJECT",
138            Self::SchemaDefinitionMissingType => "SCHEMA_DEFINITION_MISSING_TYPE",
139            Self::SchemaDefinitionInvalid => "SCHEMA_DEFINITION_INVALID",
140            Self::SchemaPropertiesMustBeObject => "SCHEMA_PROPERTIES_MUST_BE_OBJECT",
141            Self::SchemaPropertyInvalid => "SCHEMA_PROPERTY_INVALID",
142            Self::SchemaRequiredMustBeArray => "SCHEMA_REQUIRED_MUST_BE_ARRAY",
143            Self::SchemaRequiredItemMustBeString => "SCHEMA_REQUIRED_ITEM_MUST_BE_STRING",
144            Self::SchemaRequiredPropertyNotDefined => "SCHEMA_REQUIRED_PROPERTY_NOT_DEFINED",
145            Self::SchemaAdditionalPropertiesInvalid => "SCHEMA_ADDITIONAL_PROPERTIES_INVALID",
146            Self::SchemaArrayMissingItems => "SCHEMA_ARRAY_MISSING_ITEMS",
147            Self::SchemaItemsInvalid => "SCHEMA_ITEMS_INVALID",
148            Self::SchemaMapMissingValues => "SCHEMA_MAP_MISSING_VALUES",
149            Self::SchemaValuesInvalid => "SCHEMA_VALUES_INVALID",
150            Self::SchemaTupleMissingDefinition => "SCHEMA_TUPLE_MISSING_DEFINITION",
151            Self::SchemaTupleMissingProperties => "SCHEMA_TUPLE_MISSING_PROPERTIES",
152            Self::SchemaTupleInvalidFormat => "SCHEMA_TUPLE_INVALID_FORMAT",
153            Self::SchemaTuplePropertyNotDefined => "SCHEMA_TUPLE_PROPERTY_NOT_DEFINED",
154            Self::SchemaChoiceMissingChoices => "SCHEMA_CHOICE_MISSING_CHOICES",
155            Self::SchemaChoicesNotObject => "SCHEMA_CHOICES_NOT_OBJECT",
156            Self::SchemaChoiceInvalid => "SCHEMA_CHOICE_INVALID",
157            Self::SchemaSelectorNotString => "SCHEMA_SELECTOR_NOT_STRING",
158            Self::SchemaEnumNotArray => "SCHEMA_ENUM_NOT_ARRAY",
159            Self::SchemaEnumEmpty => "SCHEMA_ENUM_EMPTY",
160            Self::SchemaEnumDuplicates => "SCHEMA_ENUM_DUPLICATES",
161            Self::SchemaConstInvalid => "SCHEMA_CONST_INVALID",
162            Self::SchemaUsesNotArray => "SCHEMA_USES_NOT_ARRAY",
163            Self::SchemaUsesInvalidExtension => "SCHEMA_USES_INVALID_EXTENSION",
164            Self::SchemaOffersNotArray => "SCHEMA_OFFERS_NOT_ARRAY",
165            Self::SchemaOffersInvalidExtension => "SCHEMA_OFFERS_INVALID_EXTENSION",
166            Self::SchemaExtensionKeywordWithoutUses => "SCHEMA_EXTENSION_KEYWORD_WITHOUT_USES",
167            Self::SchemaMinMaxInvalid => "SCHEMA_MIN_MAX_INVALID",
168            Self::SchemaMinLengthInvalid => "SCHEMA_MIN_LENGTH_INVALID",
169            Self::SchemaMaxLengthInvalid => "SCHEMA_MAX_LENGTH_INVALID",
170            Self::SchemaPatternInvalid => "SCHEMA_PATTERN_INVALID",
171            Self::SchemaFormatInvalid => "SCHEMA_FORMAT_INVALID",
172            Self::SchemaConstraintTypeMismatch => "SCHEMA_CONSTRAINT_TYPE_MISMATCH",
173            Self::SchemaMinimumExceedsMaximum => "SCHEMA_MINIMUM_EXCEEDS_MAXIMUM",
174            Self::SchemaMinLengthExceedsMaxLength => "SCHEMA_MINLENGTH_EXCEEDS_MAXLENGTH",
175            Self::SchemaMinLengthNegative => "SCHEMA_MINLENGTH_NEGATIVE",
176            Self::SchemaMaxLengthNegative => "SCHEMA_MAXLENGTH_NEGATIVE",
177            Self::SchemaMinItemsExceedsMaxItems => "SCHEMA_MINITEMS_EXCEEDS_MAXITEMS",
178            Self::SchemaMinItemsNegative => "SCHEMA_MINITEMS_NEGATIVE",
179            Self::SchemaMultipleOfInvalid => "SCHEMA_MULTIPLEOF_INVALID",
180            Self::SchemaKeywordInvalidType => "SCHEMA_KEYWORD_INVALID_TYPE",
181            Self::SchemaTypeArrayEmpty => "SCHEMA_TYPE_ARRAY_EMPTY",
182            Self::SchemaTypeObjectMissingRef => "SCHEMA_TYPE_OBJECT_MISSING_REF",
183            Self::SchemaImportNotAllowed => "SCHEMA_IMPORT_NOT_ALLOWED",
184            Self::SchemaImportFailed => "SCHEMA_IMPORT_FAILED",
185            Self::SchemaImportCircular => "SCHEMA_IMPORT_CIRCULAR",
186            Self::SchemaExtendsNotString => "SCHEMA_EXTENDS_NOT_STRING",
187            Self::SchemaExtendsEmpty => "SCHEMA_EXTENDS_EMPTY",
188            Self::SchemaExtendsNotFound => "SCHEMA_EXTENDS_NOT_FOUND",
189            Self::SchemaExtendsCircular => "SCHEMA_EXTENDS_CIRCULAR",
190            Self::SchemaAltnamesNotObject => "SCHEMA_ALTNAMES_NOT_OBJECT",
191            Self::SchemaAltnamesValueNotString => "SCHEMA_ALTNAMES_VALUE_NOT_STRING",
192            Self::SchemaAllOfNotArray => "SCHEMA_ALLOF_NOT_ARRAY",
193            Self::SchemaAnyOfNotArray => "SCHEMA_ANYOF_NOT_ARRAY",
194            Self::SchemaOneOfNotArray => "SCHEMA_ONEOF_NOT_ARRAY",
195            Self::SchemaNotInvalid => "SCHEMA_NOT_INVALID",
196            Self::SchemaIfInvalid => "SCHEMA_IF_INVALID",
197            Self::SchemaThenWithoutIf => "SCHEMA_THEN_WITHOUT_IF",
198            Self::SchemaElseWithoutIf => "SCHEMA_ELSE_WITHOUT_IF",
199        }
200    }
201}
202
203impl fmt::Display for SchemaErrorCode {
204    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
205        write!(f, "{}", self.as_str())
206    }
207}
208
209/// Error codes for instance validation errors.
210///
211/// This enum is marked `#[non_exhaustive]` to allow adding new error codes
212/// in future versions without breaking semver compatibility.
213#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
214#[non_exhaustive]
215pub enum InstanceErrorCode {
216    // Type mismatch errors
217    InstanceTypeMismatch,
218    InstanceTypeUnknown,
219    
220    // String errors
221    InstanceStringExpected,
222    InstanceStringTooShort,
223    InstanceStringTooLong,
224    InstanceStringPatternMismatch,
225    InstanceStringFormatInvalid,
226    
227    // Number errors
228    InstanceNumberExpected,
229    InstanceNumberTooSmall,
230    InstanceNumberTooLarge,
231    InstanceNumberNotMultiple,
232    InstanceIntegerExpected,
233    InstanceIntegerOutOfRange,
234    InstanceDecimalExpected,
235    
236    // Boolean/Null errors
237    InstanceBooleanExpected,
238    InstanceNullExpected,
239    
240    // Object errors
241    InstanceObjectExpected,
242    InstanceRequiredMissing,
243    InstanceAdditionalProperty,
244    InstancePropertyInvalid,
245    InstanceTooFewProperties,
246    InstanceTooManyProperties,
247    InstanceDependentRequiredMissing,
248    InstancePatternPropertyMismatch,
249    InstancePropertyNameInvalid,
250    
251    // Array errors
252    InstanceArrayExpected,
253    InstanceArrayTooShort,
254    InstanceArrayTooLong,
255    InstanceArrayNotUnique,
256    InstanceArrayContainsMissing,
257    InstanceArrayContainsTooFew,
258    InstanceArrayContainsTooMany,
259    InstanceArrayItemInvalid,
260    
261    // Tuple errors
262    InstanceTupleExpected,
263    InstanceTupleLengthMismatch,
264    InstanceTupleElementInvalid,
265    
266    // Map errors
267    InstanceMapExpected,
268    InstanceMapValueInvalid,
269    InstanceMapTooFewEntries,
270    InstanceMapTooManyEntries,
271    InstanceMapKeyPatternMismatch,
272    
273    // Set errors
274    InstanceSetExpected,
275    InstanceSetNotUnique,
276    InstanceSetItemInvalid,
277    
278    // Choice errors
279    InstanceChoiceNoMatch,
280    InstanceChoiceMultipleMatches,
281    InstanceChoiceUnknown,
282    InstanceChoiceSelectorMissing,
283    InstanceChoiceSelectorInvalid,
284    
285    // Enum/Const errors
286    InstanceEnumMismatch,
287    InstanceConstMismatch,
288    
289    // Date/Time errors
290    InstanceDateExpected,
291    InstanceDateInvalid,
292    InstanceTimeExpected,
293    InstanceTimeInvalid,
294    InstanceDateTimeExpected,
295    InstanceDateTimeInvalid,
296    InstanceDurationExpected,
297    InstanceDurationInvalid,
298    
299    // UUID errors
300    InstanceUuidExpected,
301    InstanceUuidInvalid,
302    
303    // URI errors
304    InstanceUriExpected,
305    InstanceUriInvalid,
306    
307    // Binary errors
308    InstanceBinaryExpected,
309    InstanceBinaryInvalid,
310    
311    // JSON Pointer errors
312    InstanceJsonPointerExpected,
313    InstanceJsonPointerInvalid,
314    
315    // Composition errors
316    InstanceAllOfFailed,
317    InstanceAnyOfFailed,
318    InstanceOneOfFailed,
319    InstanceOneOfMultiple,
320    InstanceNotFailed,
321    InstanceIfThenFailed,
322    InstanceIfElseFailed,
323    
324    // Reference errors
325    InstanceRefNotFound,
326    
327    // Union errors
328    InstanceUnionNoMatch,
329}
330
331impl InstanceErrorCode {
332    /// Returns the string code for this error.
333    pub fn as_str(&self) -> &'static str {
334        match self {
335            Self::InstanceTypeMismatch => "INSTANCE_TYPE_MISMATCH",
336            Self::InstanceTypeUnknown => "INSTANCE_TYPE_UNKNOWN",
337            Self::InstanceStringExpected => "INSTANCE_STRING_EXPECTED",
338            Self::InstanceStringTooShort => "INSTANCE_STRING_TOO_SHORT",
339            Self::InstanceStringTooLong => "INSTANCE_STRING_TOO_LONG",
340            Self::InstanceStringPatternMismatch => "INSTANCE_STRING_PATTERN_MISMATCH",
341            Self::InstanceStringFormatInvalid => "INSTANCE_STRING_FORMAT_INVALID",
342            Self::InstanceNumberExpected => "INSTANCE_NUMBER_EXPECTED",
343            Self::InstanceNumberTooSmall => "INSTANCE_NUMBER_TOO_SMALL",
344            Self::InstanceNumberTooLarge => "INSTANCE_NUMBER_TOO_LARGE",
345            Self::InstanceNumberNotMultiple => "INSTANCE_NUMBER_NOT_MULTIPLE",
346            Self::InstanceIntegerExpected => "INSTANCE_INTEGER_EXPECTED",
347            Self::InstanceIntegerOutOfRange => "INSTANCE_INTEGER_OUT_OF_RANGE",
348            Self::InstanceDecimalExpected => "INSTANCE_DECIMAL_EXPECTED",
349            Self::InstanceBooleanExpected => "INSTANCE_BOOLEAN_EXPECTED",
350            Self::InstanceNullExpected => "INSTANCE_NULL_EXPECTED",
351            Self::InstanceObjectExpected => "INSTANCE_OBJECT_EXPECTED",
352            Self::InstanceRequiredMissing => "INSTANCE_REQUIRED_MISSING",
353            Self::InstanceAdditionalProperty => "INSTANCE_ADDITIONAL_PROPERTY",
354            Self::InstancePropertyInvalid => "INSTANCE_PROPERTY_INVALID",
355            Self::InstanceTooFewProperties => "INSTANCE_TOO_FEW_PROPERTIES",
356            Self::InstanceTooManyProperties => "INSTANCE_TOO_MANY_PROPERTIES",
357            Self::InstanceDependentRequiredMissing => "INSTANCE_DEPENDENT_REQUIRED_MISSING",
358            Self::InstancePatternPropertyMismatch => "INSTANCE_PATTERN_PROPERTY_MISMATCH",
359            Self::InstancePropertyNameInvalid => "INSTANCE_PROPERTY_NAME_INVALID",
360            Self::InstanceArrayExpected => "INSTANCE_ARRAY_EXPECTED",
361            Self::InstanceArrayTooShort => "INSTANCE_ARRAY_TOO_SHORT",
362            Self::InstanceArrayTooLong => "INSTANCE_ARRAY_TOO_LONG",
363            Self::InstanceArrayNotUnique => "INSTANCE_ARRAY_NOT_UNIQUE",
364            Self::InstanceArrayContainsMissing => "INSTANCE_ARRAY_CONTAINS_MISSING",
365            Self::InstanceArrayContainsTooFew => "INSTANCE_ARRAY_CONTAINS_TOO_FEW",
366            Self::InstanceArrayContainsTooMany => "INSTANCE_ARRAY_CONTAINS_TOO_MANY",
367            Self::InstanceArrayItemInvalid => "INSTANCE_ARRAY_ITEM_INVALID",
368            Self::InstanceTupleExpected => "INSTANCE_TUPLE_EXPECTED",
369            Self::InstanceTupleLengthMismatch => "INSTANCE_TUPLE_LENGTH_MISMATCH",
370            Self::InstanceTupleElementInvalid => "INSTANCE_TUPLE_ELEMENT_INVALID",
371            Self::InstanceMapExpected => "INSTANCE_MAP_EXPECTED",
372            Self::InstanceMapValueInvalid => "INSTANCE_MAP_VALUE_INVALID",
373            Self::InstanceMapTooFewEntries => "INSTANCE_MAP_TOO_FEW_ENTRIES",
374            Self::InstanceMapTooManyEntries => "INSTANCE_MAP_TOO_MANY_ENTRIES",
375            Self::InstanceMapKeyPatternMismatch => "INSTANCE_MAP_KEY_PATTERN_MISMATCH",
376            Self::InstanceSetExpected => "INSTANCE_SET_EXPECTED",
377            Self::InstanceSetNotUnique => "INSTANCE_SET_NOT_UNIQUE",
378            Self::InstanceSetItemInvalid => "INSTANCE_SET_ITEM_INVALID",
379            Self::InstanceChoiceNoMatch => "INSTANCE_CHOICE_NO_MATCH",
380            Self::InstanceChoiceMultipleMatches => "INSTANCE_CHOICE_MULTIPLE_MATCHES",
381            Self::InstanceChoiceUnknown => "INSTANCE_CHOICE_UNKNOWN",
382            Self::InstanceChoiceSelectorMissing => "INSTANCE_CHOICE_SELECTOR_MISSING",
383            Self::InstanceChoiceSelectorInvalid => "INSTANCE_CHOICE_SELECTOR_INVALID",
384            Self::InstanceEnumMismatch => "INSTANCE_ENUM_MISMATCH",
385            Self::InstanceConstMismatch => "INSTANCE_CONST_MISMATCH",
386            Self::InstanceDateExpected => "INSTANCE_DATE_EXPECTED",
387            Self::InstanceDateInvalid => "INSTANCE_DATE_INVALID",
388            Self::InstanceTimeExpected => "INSTANCE_TIME_EXPECTED",
389            Self::InstanceTimeInvalid => "INSTANCE_TIME_INVALID",
390            Self::InstanceDateTimeExpected => "INSTANCE_DATETIME_EXPECTED",
391            Self::InstanceDateTimeInvalid => "INSTANCE_DATETIME_INVALID",
392            Self::InstanceDurationExpected => "INSTANCE_DURATION_EXPECTED",
393            Self::InstanceDurationInvalid => "INSTANCE_DURATION_INVALID",
394            Self::InstanceUuidExpected => "INSTANCE_UUID_EXPECTED",
395            Self::InstanceUuidInvalid => "INSTANCE_UUID_INVALID",
396            Self::InstanceUriExpected => "INSTANCE_URI_EXPECTED",
397            Self::InstanceUriInvalid => "INSTANCE_URI_INVALID",
398            Self::InstanceBinaryExpected => "INSTANCE_BINARY_EXPECTED",
399            Self::InstanceBinaryInvalid => "INSTANCE_BINARY_INVALID",
400            Self::InstanceJsonPointerExpected => "INSTANCE_JSONPOINTER_EXPECTED",
401            Self::InstanceJsonPointerInvalid => "INSTANCE_JSONPOINTER_INVALID",
402            Self::InstanceAllOfFailed => "INSTANCE_ALLOF_FAILED",
403            Self::InstanceAnyOfFailed => "INSTANCE_ANYOF_FAILED",
404            Self::InstanceOneOfFailed => "INSTANCE_ONEOF_FAILED",
405            Self::InstanceOneOfMultiple => "INSTANCE_ONEOF_MULTIPLE",
406            Self::InstanceNotFailed => "INSTANCE_NOT_FAILED",
407            Self::InstanceIfThenFailed => "INSTANCE_IF_THEN_FAILED",
408            Self::InstanceIfElseFailed => "INSTANCE_IF_ELSE_FAILED",
409            Self::InstanceRefNotFound => "INSTANCE_REF_NOT_FOUND",
410            Self::InstanceUnionNoMatch => "INSTANCE_UNION_NO_MATCH",
411        }
412    }
413}
414
415impl fmt::Display for InstanceErrorCode {
416    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
417        write!(f, "{}", self.as_str())
418    }
419}