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    
219    // Boolean/Null errors
220    InstanceBooleanExpected,
221    InstanceNullExpected,
222    
223    // Object errors
224    InstanceObjectExpected,
225    InstanceRequiredMissing,
226    InstanceAdditionalProperty,
227    InstancePropertyInvalid,
228    InstanceTooFewProperties,
229    InstanceTooManyProperties,
230    InstanceDependentRequiredMissing,
231    
232    // Array errors
233    InstanceArrayExpected,
234    InstanceArrayTooShort,
235    InstanceArrayTooLong,
236    InstanceArrayNotUnique,
237    InstanceArrayContainsMissing,
238    InstanceArrayContainsTooFew,
239    InstanceArrayContainsTooMany,
240    InstanceArrayItemInvalid,
241    
242    // Tuple errors
243    InstanceTupleExpected,
244    InstanceTupleLengthMismatch,
245    InstanceTupleElementInvalid,
246    
247    // Map errors
248    InstanceMapExpected,
249    InstanceMapValueInvalid,
250    InstanceMapTooFewEntries,
251    InstanceMapTooManyEntries,
252    InstanceMapKeyPatternMismatch,
253    
254    // Set errors
255    InstanceSetExpected,
256    InstanceSetNotUnique,
257    InstanceSetItemInvalid,
258    
259    // Choice errors
260    InstanceChoiceNoMatch,
261    InstanceChoiceMultipleMatches,
262    InstanceChoiceUnknown,
263    InstanceChoiceSelectorMissing,
264    InstanceChoiceSelectorInvalid,
265    
266    // Enum/Const errors
267    InstanceEnumMismatch,
268    InstanceConstMismatch,
269    
270    // Date/Time errors
271    InstanceDateExpected,
272    InstanceDateInvalid,
273    InstanceTimeExpected,
274    InstanceTimeInvalid,
275    InstanceDateTimeExpected,
276    InstanceDateTimeInvalid,
277    InstanceDurationExpected,
278    InstanceDurationInvalid,
279    
280    // UUID errors
281    InstanceUuidExpected,
282    InstanceUuidInvalid,
283    
284    // URI errors
285    InstanceUriExpected,
286    InstanceUriInvalid,
287    
288    // Binary errors
289    InstanceBinaryExpected,
290    InstanceBinaryInvalid,
291    
292    // JSON Pointer errors
293    InstanceJsonPointerExpected,
294    InstanceJsonPointerInvalid,
295    
296    // Composition errors
297    InstanceAllOfFailed,
298    InstanceAnyOfFailed,
299    InstanceOneOfFailed,
300    InstanceOneOfMultiple,
301    InstanceNotFailed,
302    InstanceIfThenFailed,
303    InstanceIfElseFailed,
304    
305    // Reference errors
306    InstanceRefNotFound,
307    
308    // Union errors
309    InstanceUnionNoMatch,
310}
311
312impl InstanceErrorCode {
313    /// Returns the string code for this error.
314    pub fn as_str(&self) -> &'static str {
315        match self {
316            Self::InstanceTypeMismatch => "INSTANCE_TYPE_MISMATCH",
317            Self::InstanceTypeUnknown => "INSTANCE_TYPE_UNKNOWN",
318            Self::InstanceStringExpected => "INSTANCE_STRING_EXPECTED",
319            Self::InstanceStringTooShort => "INSTANCE_STRING_TOO_SHORT",
320            Self::InstanceStringTooLong => "INSTANCE_STRING_TOO_LONG",
321            Self::InstanceStringPatternMismatch => "INSTANCE_STRING_PATTERN_MISMATCH",
322            Self::InstanceStringFormatInvalid => "INSTANCE_STRING_FORMAT_INVALID",
323            Self::InstanceNumberExpected => "INSTANCE_NUMBER_EXPECTED",
324            Self::InstanceNumberTooSmall => "INSTANCE_NUMBER_TOO_SMALL",
325            Self::InstanceNumberTooLarge => "INSTANCE_NUMBER_TOO_LARGE",
326            Self::InstanceNumberNotMultiple => "INSTANCE_NUMBER_NOT_MULTIPLE",
327            Self::InstanceIntegerExpected => "INSTANCE_INTEGER_EXPECTED",
328            Self::InstanceIntegerOutOfRange => "INSTANCE_INTEGER_OUT_OF_RANGE",
329            Self::InstanceBooleanExpected => "INSTANCE_BOOLEAN_EXPECTED",
330            Self::InstanceNullExpected => "INSTANCE_NULL_EXPECTED",
331            Self::InstanceObjectExpected => "INSTANCE_OBJECT_EXPECTED",
332            Self::InstanceRequiredMissing => "INSTANCE_REQUIRED_MISSING",
333            Self::InstanceAdditionalProperty => "INSTANCE_ADDITIONAL_PROPERTY",
334            Self::InstancePropertyInvalid => "INSTANCE_PROPERTY_INVALID",
335            Self::InstanceTooFewProperties => "INSTANCE_TOO_FEW_PROPERTIES",
336            Self::InstanceTooManyProperties => "INSTANCE_TOO_MANY_PROPERTIES",
337            Self::InstanceDependentRequiredMissing => "INSTANCE_DEPENDENT_REQUIRED_MISSING",
338            Self::InstanceArrayExpected => "INSTANCE_ARRAY_EXPECTED",
339            Self::InstanceArrayTooShort => "INSTANCE_ARRAY_TOO_SHORT",
340            Self::InstanceArrayTooLong => "INSTANCE_ARRAY_TOO_LONG",
341            Self::InstanceArrayNotUnique => "INSTANCE_ARRAY_NOT_UNIQUE",
342            Self::InstanceArrayContainsMissing => "INSTANCE_ARRAY_CONTAINS_MISSING",
343            Self::InstanceArrayContainsTooFew => "INSTANCE_ARRAY_CONTAINS_TOO_FEW",
344            Self::InstanceArrayContainsTooMany => "INSTANCE_ARRAY_CONTAINS_TOO_MANY",
345            Self::InstanceArrayItemInvalid => "INSTANCE_ARRAY_ITEM_INVALID",
346            Self::InstanceTupleExpected => "INSTANCE_TUPLE_EXPECTED",
347            Self::InstanceTupleLengthMismatch => "INSTANCE_TUPLE_LENGTH_MISMATCH",
348            Self::InstanceTupleElementInvalid => "INSTANCE_TUPLE_ELEMENT_INVALID",
349            Self::InstanceMapExpected => "INSTANCE_MAP_EXPECTED",
350            Self::InstanceMapValueInvalid => "INSTANCE_MAP_VALUE_INVALID",
351            Self::InstanceMapTooFewEntries => "INSTANCE_MAP_TOO_FEW_ENTRIES",
352            Self::InstanceMapTooManyEntries => "INSTANCE_MAP_TOO_MANY_ENTRIES",
353            Self::InstanceMapKeyPatternMismatch => "INSTANCE_MAP_KEY_PATTERN_MISMATCH",
354            Self::InstanceSetExpected => "INSTANCE_SET_EXPECTED",
355            Self::InstanceSetNotUnique => "INSTANCE_SET_NOT_UNIQUE",
356            Self::InstanceSetItemInvalid => "INSTANCE_SET_ITEM_INVALID",
357            Self::InstanceChoiceNoMatch => "INSTANCE_CHOICE_NO_MATCH",
358            Self::InstanceChoiceMultipleMatches => "INSTANCE_CHOICE_MULTIPLE_MATCHES",
359            Self::InstanceChoiceUnknown => "INSTANCE_CHOICE_UNKNOWN",
360            Self::InstanceChoiceSelectorMissing => "INSTANCE_CHOICE_SELECTOR_MISSING",
361            Self::InstanceChoiceSelectorInvalid => "INSTANCE_CHOICE_SELECTOR_INVALID",
362            Self::InstanceEnumMismatch => "INSTANCE_ENUM_MISMATCH",
363            Self::InstanceConstMismatch => "INSTANCE_CONST_MISMATCH",
364            Self::InstanceDateExpected => "INSTANCE_DATE_EXPECTED",
365            Self::InstanceDateInvalid => "INSTANCE_DATE_INVALID",
366            Self::InstanceTimeExpected => "INSTANCE_TIME_EXPECTED",
367            Self::InstanceTimeInvalid => "INSTANCE_TIME_INVALID",
368            Self::InstanceDateTimeExpected => "INSTANCE_DATETIME_EXPECTED",
369            Self::InstanceDateTimeInvalid => "INSTANCE_DATETIME_INVALID",
370            Self::InstanceDurationExpected => "INSTANCE_DURATION_EXPECTED",
371            Self::InstanceDurationInvalid => "INSTANCE_DURATION_INVALID",
372            Self::InstanceUuidExpected => "INSTANCE_UUID_EXPECTED",
373            Self::InstanceUuidInvalid => "INSTANCE_UUID_INVALID",
374            Self::InstanceUriExpected => "INSTANCE_URI_EXPECTED",
375            Self::InstanceUriInvalid => "INSTANCE_URI_INVALID",
376            Self::InstanceBinaryExpected => "INSTANCE_BINARY_EXPECTED",
377            Self::InstanceBinaryInvalid => "INSTANCE_BINARY_INVALID",
378            Self::InstanceJsonPointerExpected => "INSTANCE_JSONPOINTER_EXPECTED",
379            Self::InstanceJsonPointerInvalid => "INSTANCE_JSONPOINTER_INVALID",
380            Self::InstanceAllOfFailed => "INSTANCE_ALLOF_FAILED",
381            Self::InstanceAnyOfFailed => "INSTANCE_ANYOF_FAILED",
382            Self::InstanceOneOfFailed => "INSTANCE_ONEOF_FAILED",
383            Self::InstanceOneOfMultiple => "INSTANCE_ONEOF_MULTIPLE",
384            Self::InstanceNotFailed => "INSTANCE_NOT_FAILED",
385            Self::InstanceIfThenFailed => "INSTANCE_IF_THEN_FAILED",
386            Self::InstanceIfElseFailed => "INSTANCE_IF_ELSE_FAILED",
387            Self::InstanceRefNotFound => "INSTANCE_REF_NOT_FOUND",
388            Self::InstanceUnionNoMatch => "INSTANCE_UNION_NO_MATCH",
389        }
390    }
391}
392
393impl fmt::Display for InstanceErrorCode {
394    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
395        write!(f, "{}", self.as_str())
396    }
397}