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