File Coverage

lib/JSON/Structure/ErrorCodes.pm
Criterion Covered Total %
statement 431 431 100.0
branch n/a
condition 2 5 40.0
subroutine 143 143 100.0
pod 1 1 100.0
total 577 580 99.4


line stmt bran cond sub pod time code
1             package JSON::Structure::ErrorCodes;
2              
3 18     18   1024 use strict;
  18         39  
  18         703  
4 18     18   89 use warnings;
  18         32  
  18         826  
5 18     18   261 use v5.20;
  18         58  
6              
7             our $VERSION = '0.6.0';
8              
9 18     18   102 use Exporter 'import';
  18         58  
  18         847  
10              
11             =head1 NAME
12              
13             JSON::Structure::ErrorCodes - Standardized error codes for JSON Structure validation
14              
15             =head1 DESCRIPTION
16              
17             This module defines standardized error codes for JSON Structure validation.
18             These codes are consistent across all SDK implementations.
19              
20             =cut
21              
22             # Schema Validation Errors
23 18     18   105 use constant SCHEMA_NULL => 'SCHEMA_NULL';
  18         32  
  18         1339  
24 18     18   112 use constant SCHEMA_INVALID_TYPE => 'SCHEMA_INVALID_TYPE';
  18         44  
  18         1069  
25 18     18   92 use constant SCHEMA_MAX_DEPTH_EXCEEDED => 'SCHEMA_MAX_DEPTH_EXCEEDED';
  18         2124  
  18         1093  
26 18     18   129 use constant SCHEMA_KEYWORD_INVALID_TYPE => 'SCHEMA_KEYWORD_INVALID_TYPE';
  18         48  
  18         1196  
27 18     18   93 use constant SCHEMA_KEYWORD_EMPTY => 'SCHEMA_KEYWORD_EMPTY';
  18         38  
  18         852  
28 18     18   86 use constant SCHEMA_TYPE_INVALID => 'SCHEMA_TYPE_INVALID';
  18         28  
  18         899  
29 18     18   88 use constant SCHEMA_TYPE_ARRAY_EMPTY => 'SCHEMA_TYPE_ARRAY_EMPTY';
  18         37  
  18         1021  
30 18     18   97 use constant SCHEMA_TYPE_OBJECT_MISSING_REF => 'SCHEMA_TYPE_OBJECT_MISSING_REF';
  18         42  
  18         1038  
31 18     18   90 use constant SCHEMA_REF_NOT_FOUND => 'SCHEMA_REF_NOT_FOUND';
  18         27  
  18         942  
32 18     18   104 use constant SCHEMA_REF_CIRCULAR => 'SCHEMA_REF_CIRCULAR';
  18         27  
  18         990  
33 18     18   89 use constant SCHEMA_REF_NOT_IN_TYPE => 'SCHEMA_REF_NOT_IN_TYPE';
  18         30  
  18         981  
34 18     18   124 use constant SCHEMA_MISSING_TYPE => 'SCHEMA_MISSING_TYPE';
  18         31  
  18         1011  
35 18     18   153 use constant SCHEMA_ROOT_MISSING_TYPE => 'SCHEMA_ROOT_MISSING_TYPE';
  18         40  
  18         1009  
36 18     18   326 use constant SCHEMA_ROOT_MISSING_ID => 'SCHEMA_ROOT_MISSING_ID';
  18         55  
  18         1152  
37 18     18   133 use constant SCHEMA_ROOT_MISSING_NAME => 'SCHEMA_ROOT_MISSING_NAME';
  18         49  
  18         917  
38 18     18   88 use constant SCHEMA_ROOT_CONFLICT => 'SCHEMA_ROOT_CONFLICT';
  18         74  
  18         1024  
39 18     18   111 use constant SCHEMA_NAME_INVALID => 'SCHEMA_NAME_INVALID';
  18         30  
  18         843  
40 18         1011 use constant SCHEMA_CONSTRAINT_INVALID_FOR_TYPE =>
41 18     18   110 'SCHEMA_CONSTRAINT_INVALID_FOR_TYPE';
  18         79  
42 18     18   140 use constant SCHEMA_MIN_GREATER_THAN_MAX => 'SCHEMA_MIN_GREATER_THAN_MAX';
  18         30  
  18         902  
43 18     18   104 use constant SCHEMA_PROPERTIES_NOT_OBJECT => 'SCHEMA_PROPERTIES_NOT_OBJECT';
  18         29  
  18         1077  
44 18     18   102 use constant SCHEMA_REQUIRED_NOT_ARRAY => 'SCHEMA_REQUIRED_NOT_ARRAY';
  18         92  
  18         998  
45 18         874 use constant SCHEMA_REQUIRED_ITEM_NOT_STRING =>
46 18     18   85 'SCHEMA_REQUIRED_ITEM_NOT_STRING';
  18         55  
47 18         962 use constant SCHEMA_REQUIRED_PROPERTY_NOT_DEFINED =>
48 18     18   92 'SCHEMA_REQUIRED_PROPERTY_NOT_DEFINED';
  18         29  
49 18         991 use constant SCHEMA_ADDITIONAL_PROPERTIES_INVALID =>
50 18     18   89 'SCHEMA_ADDITIONAL_PROPERTIES_INVALID';
  18         31  
51 18     18   106 use constant SCHEMA_ARRAY_MISSING_ITEMS => 'SCHEMA_ARRAY_MISSING_ITEMS';
  18         29  
  18         1008  
52 18         840 use constant SCHEMA_TUPLE_MISSING_DEFINITION =>
53 18     18   101 'SCHEMA_TUPLE_MISSING_DEFINITION';
  18         28  
54 18     18   90 use constant SCHEMA_TUPLE_ORDER_NOT_ARRAY => 'SCHEMA_TUPLE_ORDER_NOT_ARRAY';
  18         30  
  18         998  
55 18     18   99 use constant SCHEMA_MAP_MISSING_VALUES => 'SCHEMA_MAP_MISSING_VALUES';
  18         88  
  18         1150  
56 18     18   124 use constant SCHEMA_CHOICE_MISSING_CHOICES => 'SCHEMA_CHOICE_MISSING_CHOICES';
  18         30  
  18         1044  
57 18     18   90 use constant SCHEMA_CHOICES_NOT_OBJECT => 'SCHEMA_CHOICES_NOT_OBJECT';
  18         49  
  18         982  
58 18     18   94 use constant SCHEMA_PATTERN_INVALID => 'SCHEMA_PATTERN_INVALID';
  18         44  
  18         945  
59 18     18   109 use constant SCHEMA_PATTERN_NOT_STRING => 'SCHEMA_PATTERN_NOT_STRING';
  18         34  
  18         825  
60 18     18   101 use constant SCHEMA_ENUM_NOT_ARRAY => 'SCHEMA_ENUM_NOT_ARRAY';
  18         30  
  18         899  
61 18     18   86 use constant SCHEMA_ENUM_EMPTY => 'SCHEMA_ENUM_EMPTY';
  18         28  
  18         930  
62 18     18   114 use constant SCHEMA_ENUM_DUPLICATES => 'SCHEMA_ENUM_DUPLICATES';
  18         30  
  18         835  
63 18     18   100 use constant SCHEMA_COMPOSITION_EMPTY => 'SCHEMA_COMPOSITION_EMPTY';
  18         47  
  18         1127  
64 18     18   100 use constant SCHEMA_COMPOSITION_NOT_ARRAY => 'SCHEMA_COMPOSITION_NOT_ARRAY';
  18         29  
  18         949  
65 18     18   108 use constant SCHEMA_ALTNAMES_NOT_OBJECT => 'SCHEMA_ALTNAMES_NOT_OBJECT';
  18         63  
  18         1083  
66 18         1070 use constant SCHEMA_ALTNAMES_VALUE_NOT_STRING =>
67 18     18   99 'SCHEMA_ALTNAMES_VALUE_NOT_STRING';
  18         115  
68 18         1125 use constant SCHEMA_INTEGER_CONSTRAINT_INVALID =>
69 18     18   95 'SCHEMA_INTEGER_CONSTRAINT_INVALID';
  18         29  
70 18         942 use constant SCHEMA_NUMBER_CONSTRAINT_INVALID =>
71 18     18   101 'SCHEMA_NUMBER_CONSTRAINT_INVALID';
  18         39  
72 18         1002 use constant SCHEMA_POSITIVE_NUMBER_CONSTRAINT_INVALID =>
73 18     18   92 'SCHEMA_POSITIVE_NUMBER_CONSTRAINT_INVALID';
  18         32  
74 18         920 use constant SCHEMA_UNIQUE_ITEMS_NOT_BOOLEAN =>
75 18     18   150 'SCHEMA_UNIQUE_ITEMS_NOT_BOOLEAN';
  18         50  
76 18     18   97 use constant SCHEMA_ITEMS_INVALID_FOR_TUPLE => 'SCHEMA_ITEMS_INVALID_FOR_TUPLE';
  18         42  
  18         958  
77 18     18   115 use constant SCHEMA_USES_UNKNOWN_EXTENSION => 'SCHEMA_USES_UNKNOWN_EXTENSION';
  18         31  
  18         933  
78 18     18   96 use constant SCHEMA_EXTENDS_CIRCULAR => 'SCHEMA_EXTENDS_CIRCULAR';
  18         33  
  18         1115  
79 18     18   112 use constant SCHEMA_EXTENDS_NOT_FOUND => 'SCHEMA_EXTENDS_NOT_FOUND';
  18         41  
  18         1083  
80 18     18   92 use constant SCHEMA_REF_INVALID => 'SCHEMA_REF_INVALID';
  18         30  
  18         953  
81 18         800 use constant SCHEMA_EXTENSION_KEYWORD_NOT_ENABLED =>
82 18     18   114 'SCHEMA_EXTENSION_KEYWORD_NOT_ENABLED';
  18         31  
83 18     18   98 use constant SCHEMA_MIN_ITEMS_NEGATIVE => 'SCHEMA_MIN_ITEMS_NEGATIVE';
  18         41  
  18         922  
84 18     18   104 use constant SCHEMA_MIN_LENGTH_NEGATIVE => 'SCHEMA_MIN_LENGTH_NEGATIVE';
  18         28  
  18         1042  
85 18         982 use constant SCHEMA_MULTIPLE_OF_NOT_POSITIVE =>
86 18     18   99 'SCHEMA_MULTIPLE_OF_NOT_POSITIVE';
  18         30  
87 18         988 use constant SCHEMA_CONSTRAINT_TYPE_MISMATCH =>
88 18     18   121 'SCHEMA_CONSTRAINT_TYPE_MISMATCH';
  18         32  
89 18     18   91 use constant SCHEMA_CIRCULAR_REF => 'SCHEMA_CIRCULAR_REF';
  18         32  
  18         1122  
90              
91             # Instance Validation Errors
92 18     18   114 use constant INSTANCE_ROOT_UNRESOLVED => 'INSTANCE_ROOT_UNRESOLVED';
  18         43  
  18         1069  
93 18     18   110 use constant INSTANCE_MAX_DEPTH_EXCEEDED => 'INSTANCE_MAX_DEPTH_EXCEEDED';
  18         34  
  18         981  
94 18     18   130 use constant INSTANCE_SCHEMA_FALSE => 'INSTANCE_SCHEMA_FALSE';
  18         32  
  18         1031  
95 18     18   147 use constant INSTANCE_REF_UNRESOLVED => 'INSTANCE_REF_UNRESOLVED';
  18         90  
  18         1021  
96 18     18   94 use constant INSTANCE_CONST_MISMATCH => 'INSTANCE_CONST_MISMATCH';
  18         29  
  18         980  
97 18     18   93 use constant INSTANCE_ENUM_MISMATCH => 'INSTANCE_ENUM_MISMATCH';
  18         31  
  18         947  
98 18     18   119 use constant INSTANCE_ANY_OF_NONE_MATCHED => 'INSTANCE_ANY_OF_NONE_MATCHED';
  18         28  
  18         824  
99 18     18   86 use constant INSTANCE_ONE_OF_INVALID_COUNT => 'INSTANCE_ONE_OF_INVALID_COUNT';
  18         30  
  18         981  
100 18     18   87 use constant INSTANCE_NOT_MATCHED => 'INSTANCE_NOT_MATCHED';
  18         52  
  18         1081  
101 18     18   92 use constant INSTANCE_TYPE_UNKNOWN => 'INSTANCE_TYPE_UNKNOWN';
  18         48  
  18         946  
102 18     18   100 use constant INSTANCE_TYPE_MISMATCH => 'INSTANCE_TYPE_MISMATCH';
  18         43  
  18         973  
103 18     18   97 use constant INSTANCE_NULL_EXPECTED => 'INSTANCE_NULL_EXPECTED';
  18         33  
  18         881  
104 18     18   94 use constant INSTANCE_BOOLEAN_EXPECTED => 'INSTANCE_BOOLEAN_EXPECTED';
  18         31  
  18         873  
105 18     18   103 use constant INSTANCE_STRING_EXPECTED => 'INSTANCE_STRING_EXPECTED';
  18         32  
  18         923  
106 18     18   125 use constant INSTANCE_STRING_MIN_LENGTH => 'INSTANCE_STRING_MIN_LENGTH';
  18         35  
  18         930  
107 18     18   94 use constant INSTANCE_STRING_MAX_LENGTH => 'INSTANCE_STRING_MAX_LENGTH';
  18         30  
  18         1216  
108 18         1174 use constant INSTANCE_STRING_PATTERN_MISMATCH =>
109 18     18   450 'INSTANCE_STRING_PATTERN_MISMATCH';
  18         188  
110 18     18   167 use constant INSTANCE_PATTERN_INVALID => 'INSTANCE_PATTERN_INVALID';
  18         35  
  18         960  
111 18     18   94 use constant INSTANCE_FORMAT_EMAIL_INVALID => 'INSTANCE_FORMAT_EMAIL_INVALID';
  18         30  
  18         939  
112 18     18   108 use constant INSTANCE_FORMAT_URI_INVALID => 'INSTANCE_FORMAT_URI_INVALID';
  18         30  
  18         932  
113 18         1062 use constant INSTANCE_FORMAT_URI_REFERENCE_INVALID =>
114 18     18   109 'INSTANCE_FORMAT_URI_REFERENCE_INVALID';
  18         125  
115 18     18   108 use constant INSTANCE_FORMAT_DATE_INVALID => 'INSTANCE_FORMAT_DATE_INVALID';
  18         27  
  18         940  
116 18     18   171 use constant INSTANCE_FORMAT_TIME_INVALID => 'INSTANCE_FORMAT_TIME_INVALID';
  18         75  
  18         1160  
117 18         990 use constant INSTANCE_FORMAT_DATETIME_INVALID =>
118 18     18   116 'INSTANCE_FORMAT_DATETIME_INVALID';
  18         111  
119 18     18   145 use constant INSTANCE_FORMAT_UUID_INVALID => 'INSTANCE_FORMAT_UUID_INVALID';
  18         30  
  18         1040  
120 18     18   139 use constant INSTANCE_FORMAT_IPV4_INVALID => 'INSTANCE_FORMAT_IPV4_INVALID';
  18         64  
  18         1092  
121 18     18   111 use constant INSTANCE_FORMAT_IPV6_INVALID => 'INSTANCE_FORMAT_IPV6_INVALID';
  18         42  
  18         943  
122 18         950 use constant INSTANCE_FORMAT_HOSTNAME_INVALID =>
123 18     18   116 'INSTANCE_FORMAT_HOSTNAME_INVALID';
  18         34  
124 18     18   95 use constant INSTANCE_NUMBER_EXPECTED => 'INSTANCE_NUMBER_EXPECTED';
  18         46  
  18         1194  
125 18     18   102 use constant INSTANCE_INTEGER_EXPECTED => 'INSTANCE_INTEGER_EXPECTED';
  18         68  
  18         1190  
126 18     18   100 use constant INSTANCE_INT_RANGE_INVALID => 'INSTANCE_INT_RANGE_INVALID';
  18         32  
  18         950  
127 18     18   110 use constant INSTANCE_NUMBER_MINIMUM => 'INSTANCE_NUMBER_MINIMUM';
  18         29  
  18         1085  
128 18     18   125 use constant INSTANCE_NUMBER_MAXIMUM => 'INSTANCE_NUMBER_MAXIMUM';
  18         32  
  18         1055  
129 18         1124 use constant INSTANCE_NUMBER_EXCLUSIVE_MINIMUM =>
130 18     18   106 'INSTANCE_NUMBER_EXCLUSIVE_MINIMUM';
  18         30  
131 18         1073 use constant INSTANCE_NUMBER_EXCLUSIVE_MAXIMUM =>
132 18     18   117 'INSTANCE_NUMBER_EXCLUSIVE_MAXIMUM';
  18         48  
133 18     18   110 use constant INSTANCE_NUMBER_MULTIPLE_OF => 'INSTANCE_NUMBER_MULTIPLE_OF';
  18         29  
  18         855  
134 18     18   93 use constant INSTANCE_OBJECT_EXPECTED => 'INSTANCE_OBJECT_EXPECTED';
  18         67  
  18         916  
135 18         987 use constant INSTANCE_REQUIRED_PROPERTY_MISSING =>
136 18     18   93 'INSTANCE_REQUIRED_PROPERTY_MISSING';
  18         34  
137 18         1077 use constant INSTANCE_ADDITIONAL_PROPERTY_NOT_ALLOWED =>
138 18     18   108 'INSTANCE_ADDITIONAL_PROPERTY_NOT_ALLOWED';
  18         29  
139 18     18   92 use constant INSTANCE_MIN_PROPERTIES => 'INSTANCE_MIN_PROPERTIES';
  18         67  
  18         1052  
140 18     18   95 use constant INSTANCE_MAX_PROPERTIES => 'INSTANCE_MAX_PROPERTIES';
  18         32  
  18         1051  
141 18     18   94 use constant INSTANCE_DEPENDENT_REQUIRED => 'INSTANCE_DEPENDENT_REQUIRED';
  18         88  
  18         921  
142 18     18   142 use constant INSTANCE_ARRAY_EXPECTED => 'INSTANCE_ARRAY_EXPECTED';
  18         42  
  18         982  
143 18     18   123 use constant INSTANCE_MIN_ITEMS => 'INSTANCE_MIN_ITEMS';
  18         36  
  18         1008  
144 18     18   96 use constant INSTANCE_MAX_ITEMS => 'INSTANCE_MAX_ITEMS';
  18         42  
  18         925  
145 18     18   111 use constant INSTANCE_MIN_CONTAINS => 'INSTANCE_MIN_CONTAINS';
  18         50  
  18         1617  
146 18     18   121 use constant INSTANCE_MAX_CONTAINS => 'INSTANCE_MAX_CONTAINS';
  18         33  
  18         1131  
147 18     18   99 use constant INSTANCE_SET_EXPECTED => 'INSTANCE_SET_EXPECTED';
  18         31  
  18         808  
148 18     18   94 use constant INSTANCE_SET_DUPLICATE => 'INSTANCE_SET_DUPLICATE';
  18         48  
  18         877  
149 18     18   92 use constant INSTANCE_MAP_EXPECTED => 'INSTANCE_MAP_EXPECTED';
  18         33  
  18         976  
150 18     18   110 use constant INSTANCE_MAP_MIN_ENTRIES => 'INSTANCE_MAP_MIN_ENTRIES';
  18         35  
  18         989  
151 18     18   95 use constant INSTANCE_MAP_MAX_ENTRIES => 'INSTANCE_MAP_MAX_ENTRIES';
  18         37  
  18         1142  
152 18     18   93 use constant INSTANCE_MAP_KEY_INVALID => 'INSTANCE_MAP_KEY_INVALID';
  18         32  
  18         930  
153 18         1040 use constant INSTANCE_MAP_KEY_PATTERN_MISMATCH =>
154 18     18   160 'INSTANCE_MAP_KEY_PATTERN_MISMATCH';
  18         58  
155 18     18   143 use constant INSTANCE_TUPLE_EXPECTED => 'INSTANCE_TUPLE_EXPECTED';
  18         31  
  18         1111  
156 18     18   122 use constant INSTANCE_TUPLE_LENGTH_MISMATCH => 'INSTANCE_TUPLE_LENGTH_MISMATCH';
  18         44  
  18         938  
157 18         966 use constant INSTANCE_TUPLE_ADDITIONAL_ITEMS =>
158 18     18   104 'INSTANCE_TUPLE_ADDITIONAL_ITEMS';
  18         38  
159 18     18   104 use constant INSTANCE_CHOICE_EXPECTED => 'INSTANCE_CHOICE_EXPECTED';
  18         30  
  18         973  
160 18         1037 use constant INSTANCE_CHOICE_MISSING_CHOICES =>
161 18     18   118 'INSTANCE_CHOICE_MISSING_CHOICES';
  18         33  
162 18         1153 use constant INSTANCE_CHOICE_SELECTOR_MISSING =>
163 18     18   117 'INSTANCE_CHOICE_SELECTOR_MISSING';
  18         71  
164 18         1111 use constant INSTANCE_CHOICE_SELECTOR_NOT_STRING =>
165 18     18   154 'INSTANCE_CHOICE_SELECTOR_NOT_STRING';
  18         36  
166 18     18   102 use constant INSTANCE_CHOICE_UNKNOWN => 'INSTANCE_CHOICE_UNKNOWN';
  18         31  
  18         964  
167 18     18   95 use constant INSTANCE_CHOICE_NO_MATCH => 'INSTANCE_CHOICE_NO_MATCH';
  18         29  
  18         941  
168 18         1082 use constant INSTANCE_CHOICE_MULTIPLE_MATCHES =>
169 18     18   93 'INSTANCE_CHOICE_MULTIPLE_MATCHES';
  18         30  
170 18     18   107 use constant INSTANCE_DATE_EXPECTED => 'INSTANCE_DATE_EXPECTED';
  18         45  
  18         918  
171 18     18   103 use constant INSTANCE_DATE_FORMAT_INVALID => 'INSTANCE_DATE_FORMAT_INVALID';
  18         30  
  18         1048  
172 18     18   96 use constant INSTANCE_TIME_EXPECTED => 'INSTANCE_TIME_EXPECTED';
  18         31  
  18         935  
173 18     18   134 use constant INSTANCE_TIME_FORMAT_INVALID => 'INSTANCE_TIME_FORMAT_INVALID';
  18         42  
  18         1035  
174 18     18   118 use constant INSTANCE_DATETIME_EXPECTED => 'INSTANCE_DATETIME_EXPECTED';
  18         32  
  18         1001  
175 18         1048 use constant INSTANCE_DATETIME_FORMAT_INVALID =>
176 18     18   97 'INSTANCE_DATETIME_FORMAT_INVALID';
  18         33  
177 18     18   116 use constant INSTANCE_DURATION_EXPECTED => 'INSTANCE_DURATION_EXPECTED';
  18         37  
  18         1208  
178 18         951 use constant INSTANCE_DURATION_FORMAT_INVALID =>
179 18     18   99 'INSTANCE_DURATION_FORMAT_INVALID';
  18         30  
180 18     18   97 use constant INSTANCE_UUID_EXPECTED => 'INSTANCE_UUID_EXPECTED';
  18         34  
  18         828  
181 18     18   88 use constant INSTANCE_UUID_FORMAT_INVALID => 'INSTANCE_UUID_FORMAT_INVALID';
  18         41  
  18         961  
182 18     18   96 use constant INSTANCE_URI_EXPECTED => 'INSTANCE_URI_EXPECTED';
  18         40  
  18         894  
183 18     18   127 use constant INSTANCE_URI_FORMAT_INVALID => 'INSTANCE_URI_FORMAT_INVALID';
  18         33  
  18         1093  
184 18     18   178 use constant INSTANCE_URI_MISSING_SCHEME => 'INSTANCE_URI_MISSING_SCHEME';
  18         31  
  18         1019  
185 18     18   107 use constant INSTANCE_BINARY_EXPECTED => 'INSTANCE_BINARY_EXPECTED';
  18         36  
  18         925  
186 18         1145 use constant INSTANCE_BINARY_ENCODING_INVALID =>
187 18     18   107 'INSTANCE_BINARY_ENCODING_INVALID';
  18         29  
188 18     18   111 use constant INSTANCE_JSONPOINTER_EXPECTED => 'INSTANCE_JSONPOINTER_EXPECTED';
  18         33  
  18         984  
189 18         908 use constant INSTANCE_JSONPOINTER_FORMAT_INVALID =>
190 18     18   114 'INSTANCE_JSONPOINTER_FORMAT_INVALID';
  18         31  
191 18     18   99 use constant INSTANCE_DECIMAL_EXPECTED => 'INSTANCE_DECIMAL_EXPECTED';
  18         46  
  18         939  
192 18     18   93 use constant INSTANCE_STRING_NOT_EXPECTED => 'INSTANCE_STRING_NOT_EXPECTED';
  18         32  
  18         1076  
193 18         22733 use constant INSTANCE_CUSTOM_TYPE_NOT_SUPPORTED =>
194 18     18   119 'INSTANCE_CUSTOM_TYPE_NOT_SUPPORTED';
  18         34  
195              
196             # Export all error codes
197             our @EXPORT_OK = qw(
198             SCHEMA_NULL
199             SCHEMA_INVALID_TYPE
200             SCHEMA_MAX_DEPTH_EXCEEDED
201             SCHEMA_KEYWORD_INVALID_TYPE
202             SCHEMA_KEYWORD_EMPTY
203             SCHEMA_TYPE_INVALID
204             SCHEMA_TYPE_ARRAY_EMPTY
205             SCHEMA_TYPE_OBJECT_MISSING_REF
206             SCHEMA_REF_NOT_FOUND
207             SCHEMA_REF_CIRCULAR
208             SCHEMA_REF_NOT_IN_TYPE
209             SCHEMA_MISSING_TYPE
210             SCHEMA_ROOT_MISSING_TYPE
211             SCHEMA_ROOT_MISSING_ID
212             SCHEMA_ROOT_MISSING_NAME
213             SCHEMA_ROOT_CONFLICT
214             SCHEMA_NAME_INVALID
215             SCHEMA_CONSTRAINT_INVALID_FOR_TYPE
216             SCHEMA_MIN_GREATER_THAN_MAX
217             SCHEMA_PROPERTIES_NOT_OBJECT
218             SCHEMA_REQUIRED_NOT_ARRAY
219             SCHEMA_REQUIRED_ITEM_NOT_STRING
220             SCHEMA_REQUIRED_PROPERTY_NOT_DEFINED
221             SCHEMA_ADDITIONAL_PROPERTIES_INVALID
222             SCHEMA_ARRAY_MISSING_ITEMS
223             SCHEMA_TUPLE_MISSING_DEFINITION
224             SCHEMA_TUPLE_ORDER_NOT_ARRAY
225             SCHEMA_MAP_MISSING_VALUES
226             SCHEMA_CHOICE_MISSING_CHOICES
227             SCHEMA_CHOICES_NOT_OBJECT
228             SCHEMA_PATTERN_INVALID
229             SCHEMA_PATTERN_NOT_STRING
230             SCHEMA_ENUM_NOT_ARRAY
231             SCHEMA_ENUM_EMPTY
232             SCHEMA_ENUM_DUPLICATES
233             SCHEMA_COMPOSITION_EMPTY
234             SCHEMA_COMPOSITION_NOT_ARRAY
235             SCHEMA_ALTNAMES_NOT_OBJECT
236             SCHEMA_ALTNAMES_VALUE_NOT_STRING
237             SCHEMA_INTEGER_CONSTRAINT_INVALID
238             SCHEMA_NUMBER_CONSTRAINT_INVALID
239             SCHEMA_POSITIVE_NUMBER_CONSTRAINT_INVALID
240             SCHEMA_UNIQUE_ITEMS_NOT_BOOLEAN
241             SCHEMA_ITEMS_INVALID_FOR_TUPLE
242             SCHEMA_USES_UNKNOWN_EXTENSION
243             SCHEMA_EXTENDS_CIRCULAR
244             SCHEMA_EXTENDS_NOT_FOUND
245             SCHEMA_REF_INVALID
246             SCHEMA_EXTENSION_KEYWORD_NOT_ENABLED
247             SCHEMA_MIN_ITEMS_NEGATIVE
248             SCHEMA_MIN_LENGTH_NEGATIVE
249             SCHEMA_MULTIPLE_OF_NOT_POSITIVE
250             SCHEMA_CONSTRAINT_TYPE_MISMATCH
251             SCHEMA_CIRCULAR_REF
252              
253             INSTANCE_ROOT_UNRESOLVED
254             INSTANCE_MAX_DEPTH_EXCEEDED
255             INSTANCE_SCHEMA_FALSE
256             INSTANCE_REF_UNRESOLVED
257             INSTANCE_CONST_MISMATCH
258             INSTANCE_ENUM_MISMATCH
259             INSTANCE_ANY_OF_NONE_MATCHED
260             INSTANCE_ONE_OF_INVALID_COUNT
261             INSTANCE_NOT_MATCHED
262             INSTANCE_TYPE_UNKNOWN
263             INSTANCE_TYPE_MISMATCH
264             INSTANCE_NULL_EXPECTED
265             INSTANCE_BOOLEAN_EXPECTED
266             INSTANCE_STRING_EXPECTED
267             INSTANCE_STRING_MIN_LENGTH
268             INSTANCE_STRING_MAX_LENGTH
269             INSTANCE_STRING_PATTERN_MISMATCH
270             INSTANCE_PATTERN_INVALID
271             INSTANCE_FORMAT_EMAIL_INVALID
272             INSTANCE_FORMAT_URI_INVALID
273             INSTANCE_FORMAT_URI_REFERENCE_INVALID
274             INSTANCE_FORMAT_DATE_INVALID
275             INSTANCE_FORMAT_TIME_INVALID
276             INSTANCE_FORMAT_DATETIME_INVALID
277             INSTANCE_FORMAT_UUID_INVALID
278             INSTANCE_FORMAT_IPV4_INVALID
279             INSTANCE_FORMAT_IPV6_INVALID
280             INSTANCE_FORMAT_HOSTNAME_INVALID
281             INSTANCE_NUMBER_EXPECTED
282             INSTANCE_INTEGER_EXPECTED
283             INSTANCE_INT_RANGE_INVALID
284             INSTANCE_NUMBER_MINIMUM
285             INSTANCE_NUMBER_MAXIMUM
286             INSTANCE_NUMBER_EXCLUSIVE_MINIMUM
287             INSTANCE_NUMBER_EXCLUSIVE_MAXIMUM
288             INSTANCE_NUMBER_MULTIPLE_OF
289             INSTANCE_OBJECT_EXPECTED
290             INSTANCE_REQUIRED_PROPERTY_MISSING
291             INSTANCE_ADDITIONAL_PROPERTY_NOT_ALLOWED
292             INSTANCE_MIN_PROPERTIES
293             INSTANCE_MAX_PROPERTIES
294             INSTANCE_DEPENDENT_REQUIRED
295             INSTANCE_ARRAY_EXPECTED
296             INSTANCE_MIN_ITEMS
297             INSTANCE_MAX_ITEMS
298             INSTANCE_MIN_CONTAINS
299             INSTANCE_MAX_CONTAINS
300             INSTANCE_SET_EXPECTED
301             INSTANCE_SET_DUPLICATE
302             INSTANCE_MAP_EXPECTED
303             INSTANCE_MAP_MIN_ENTRIES
304             INSTANCE_MAP_MAX_ENTRIES
305             INSTANCE_MAP_KEY_INVALID
306             INSTANCE_MAP_KEY_PATTERN_MISMATCH
307             INSTANCE_TUPLE_EXPECTED
308             INSTANCE_TUPLE_LENGTH_MISMATCH
309             INSTANCE_TUPLE_ADDITIONAL_ITEMS
310             INSTANCE_CHOICE_EXPECTED
311             INSTANCE_CHOICE_MISSING_CHOICES
312             INSTANCE_CHOICE_SELECTOR_MISSING
313             INSTANCE_CHOICE_SELECTOR_NOT_STRING
314             INSTANCE_CHOICE_UNKNOWN
315             INSTANCE_CHOICE_NO_MATCH
316             INSTANCE_CHOICE_MULTIPLE_MATCHES
317             INSTANCE_DATE_EXPECTED
318             INSTANCE_DATE_FORMAT_INVALID
319             INSTANCE_TIME_EXPECTED
320             INSTANCE_TIME_FORMAT_INVALID
321             INSTANCE_DATETIME_EXPECTED
322             INSTANCE_DATETIME_FORMAT_INVALID
323             INSTANCE_DURATION_EXPECTED
324             INSTANCE_DURATION_FORMAT_INVALID
325             INSTANCE_UUID_EXPECTED
326             INSTANCE_UUID_FORMAT_INVALID
327             INSTANCE_URI_EXPECTED
328             INSTANCE_URI_FORMAT_INVALID
329             INSTANCE_URI_MISSING_SCHEME
330             INSTANCE_BINARY_EXPECTED
331             INSTANCE_BINARY_ENCODING_INVALID
332             INSTANCE_JSONPOINTER_EXPECTED
333             INSTANCE_JSONPOINTER_FORMAT_INVALID
334             INSTANCE_DECIMAL_EXPECTED
335             INSTANCE_STRING_NOT_EXPECTED
336             INSTANCE_CUSTOM_TYPE_NOT_SUPPORTED
337             );
338              
339             our %EXPORT_TAGS = (
340             all => \@EXPORT_OK,
341             schema => [ grep { /^SCHEMA_/ } @EXPORT_OK ],
342             instance => [ grep { /^INSTANCE_/ } @EXPORT_OK ],
343             );
344              
345             # Error message templates (matching error-messages.json)
346             our %ERROR_MESSAGES = (
347             SCHEMA_NULL() => 'Schema cannot be null',
348             SCHEMA_INVALID_TYPE() => 'Schema must be a boolean or object',
349             SCHEMA_MAX_DEPTH_EXCEEDED() =>
350             'Maximum validation depth ({maxDepth}) exceeded',
351             SCHEMA_KEYWORD_INVALID_TYPE() => '{keyword} must be {expectedType}',
352             SCHEMA_KEYWORD_EMPTY() => '{keyword} cannot be empty',
353             SCHEMA_TYPE_INVALID() => "Invalid type: '{typeName}'",
354             SCHEMA_TYPE_ARRAY_EMPTY() => 'type array cannot be empty',
355             SCHEMA_TYPE_OBJECT_MISSING_REF() => 'type object must contain $ref',
356             SCHEMA_REF_NOT_FOUND() => '$ref target does not exist: {refPath}',
357             SCHEMA_REF_CIRCULAR() => 'Circular reference detected: {refPath}',
358             SCHEMA_REF_NOT_IN_TYPE() =>
359             q{$ref is only permitted inside the 'type' attribute. Use { "type": { "$ref": "..." } } instead of { "$ref": "..." }},
360             SCHEMA_MISSING_TYPE() =>
361             "Schema must have a 'type' keyword or other schema-defining keyword",
362             SCHEMA_ROOT_MISSING_TYPE() =>
363             "Root schema must have 'type', '\$root', or other schema-defining keyword",
364             SCHEMA_ROOT_MISSING_ID() => "Missing required '\$id' keyword at root",
365             SCHEMA_ROOT_MISSING_NAME() =>
366             "Root schema with 'type' must have a 'name' property",
367             SCHEMA_ROOT_CONFLICT() =>
368             "Document cannot have both 'type' at root and '\$root' at the same time",
369             SCHEMA_NAME_INVALID() =>
370             '{keyword} must be a valid identifier (start with letter or underscore, contain only letters, digits, underscores)',
371             SCHEMA_CONSTRAINT_INVALID_FOR_TYPE() =>
372             "'{constraint}' constraint is only valid for {validTypes}, not '{actualType}'",
373             SCHEMA_MIN_GREATER_THAN_MAX() =>
374             "'{minKeyword}' cannot be greater than '{maxKeyword}'",
375             SCHEMA_PROPERTIES_NOT_OBJECT() => 'properties must be an object',
376             SCHEMA_REQUIRED_NOT_ARRAY() => 'required must be an array',
377             SCHEMA_REQUIRED_ITEM_NOT_STRING() => 'required array items must be strings',
378             SCHEMA_REQUIRED_PROPERTY_NOT_DEFINED() =>
379             "Required property '{propertyName}' is not defined in properties",
380             SCHEMA_ADDITIONAL_PROPERTIES_INVALID() =>
381             'additionalProperties must be a boolean or schema',
382             SCHEMA_ARRAY_MISSING_ITEMS() =>
383             "array type requires 'items' or 'contains' schema",
384             SCHEMA_TUPLE_MISSING_DEFINITION() =>
385             "tuple type requires 'properties' and 'tuple' keywords",
386             SCHEMA_TUPLE_ORDER_NOT_ARRAY() =>
387             "'tuple' keyword must be an array of property names",
388             SCHEMA_MAP_MISSING_VALUES() => "map type requires 'values' schema",
389             SCHEMA_CHOICE_MISSING_CHOICES() => "choice type requires 'choices' keyword",
390             SCHEMA_CHOICES_NOT_OBJECT() => 'choices must be an object',
391             SCHEMA_PATTERN_INVALID() =>
392             "pattern is not a valid regular expression: '{pattern}'",
393             SCHEMA_PATTERN_NOT_STRING() => 'pattern must be a string',
394             SCHEMA_ENUM_NOT_ARRAY() => 'enum must be an array',
395             SCHEMA_ENUM_EMPTY() => 'enum array cannot be empty',
396             SCHEMA_ENUM_DUPLICATES() => 'enum array contains duplicate values',
397             SCHEMA_COMPOSITION_EMPTY() => '{keyword} array cannot be empty',
398             SCHEMA_COMPOSITION_NOT_ARRAY() => '{keyword} must be an array',
399             SCHEMA_ALTNAMES_NOT_OBJECT() => 'altnames must be an object',
400             SCHEMA_ALTNAMES_VALUE_NOT_STRING() => 'altnames values must be strings',
401             SCHEMA_INTEGER_CONSTRAINT_INVALID() =>
402             '{keyword} must be a non-negative integer',
403             SCHEMA_NUMBER_CONSTRAINT_INVALID() => '{keyword} must be a number',
404             SCHEMA_POSITIVE_NUMBER_CONSTRAINT_INVALID() =>
405             '{keyword} must be a positive number',
406             SCHEMA_UNIQUE_ITEMS_NOT_BOOLEAN() => 'uniqueItems must be a boolean',
407             SCHEMA_ITEMS_INVALID_FOR_TUPLE() =>
408             'items must be a boolean or schema for tuple type',
409              
410             INSTANCE_ROOT_UNRESOLVED() =>
411             'Unable to resolve $root reference: {refPath}',
412             INSTANCE_MAX_DEPTH_EXCEEDED() =>
413             'Maximum validation depth ({maxDepth}) exceeded',
414             INSTANCE_SCHEMA_FALSE() => "Schema 'false' rejects all values",
415             INSTANCE_REF_UNRESOLVED() => 'Unable to resolve reference: {refPath}',
416             INSTANCE_CONST_MISMATCH() => 'Value must equal const value',
417             INSTANCE_ENUM_MISMATCH() => 'Value must be one of the enum values',
418             INSTANCE_ANY_OF_NONE_MATCHED() =>
419             'Value must match at least one schema in anyOf',
420             INSTANCE_ONE_OF_INVALID_COUNT() =>
421             'Value must match exactly one schema in oneOf (matched {matchCount})',
422             INSTANCE_NOT_MATCHED() => "Value must not match the schema in 'not'",
423             INSTANCE_TYPE_UNKNOWN() => 'Unknown type: {typeName}',
424             INSTANCE_TYPE_MISMATCH() => 'Value must be {expectedType}',
425             INSTANCE_NULL_EXPECTED() => 'Value must be null',
426             INSTANCE_BOOLEAN_EXPECTED() => 'Value must be a boolean',
427             INSTANCE_STRING_EXPECTED() => 'Value must be a string',
428             INSTANCE_STRING_MIN_LENGTH() =>
429             'String length {actualLength} is less than minimum {minLength}',
430             INSTANCE_STRING_MAX_LENGTH() =>
431             'String length {actualLength} exceeds maximum {maxLength}',
432             INSTANCE_STRING_PATTERN_MISMATCH() =>
433             'String does not match pattern: {pattern}',
434             INSTANCE_PATTERN_INVALID() => 'Invalid regex pattern: {pattern}',
435             INSTANCE_FORMAT_EMAIL_INVALID() => 'String is not a valid email address',
436             INSTANCE_FORMAT_URI_INVALID() => 'String is not a valid URI',
437             INSTANCE_FORMAT_URI_REFERENCE_INVALID() =>
438             'String is not a valid URI reference',
439             INSTANCE_FORMAT_DATE_INVALID() => 'String is not a valid date',
440             INSTANCE_FORMAT_TIME_INVALID() => 'String is not a valid time',
441             INSTANCE_FORMAT_DATETIME_INVALID() => 'String is not a valid date-time',
442             INSTANCE_FORMAT_UUID_INVALID() => 'String is not a valid UUID',
443             INSTANCE_FORMAT_IPV4_INVALID() => 'String is not a valid IPv4 address',
444             INSTANCE_FORMAT_IPV6_INVALID() => 'String is not a valid IPv6 address',
445             INSTANCE_FORMAT_HOSTNAME_INVALID() => 'String is not a valid hostname',
446             INSTANCE_NUMBER_EXPECTED() => 'Value must be a number',
447             INSTANCE_INTEGER_EXPECTED() => 'Value must be an integer',
448             INSTANCE_INT_RANGE_INVALID() => 'Value {value} is not a valid {typeName}',
449             INSTANCE_NUMBER_MINIMUM() => 'Value {value} is less than minimum {minimum}',
450             INSTANCE_NUMBER_MAXIMUM() => 'Value {value} exceeds maximum {maximum}',
451             INSTANCE_NUMBER_EXCLUSIVE_MINIMUM() =>
452             'Value {value} must be greater than {exclusiveMinimum}',
453             INSTANCE_NUMBER_EXCLUSIVE_MAXIMUM() =>
454             'Value {value} must be less than {exclusiveMaximum}',
455             INSTANCE_NUMBER_MULTIPLE_OF() =>
456             'Value {value} is not a multiple of {multipleOf}',
457             INSTANCE_OBJECT_EXPECTED() => 'Value must be an object',
458             INSTANCE_REQUIRED_PROPERTY_MISSING() =>
459             'Missing required property: {propertyName}',
460             INSTANCE_ADDITIONAL_PROPERTY_NOT_ALLOWED() =>
461             'Additional property not allowed: {propertyName}',
462             INSTANCE_MIN_PROPERTIES() =>
463             'Object has {actualCount} properties, minimum is {minProperties}',
464             INSTANCE_MAX_PROPERTIES() =>
465             'Object has {actualCount} properties, maximum is {maxProperties}',
466             INSTANCE_DEPENDENT_REQUIRED() =>
467             "Property '{sourceProperty}' requires property '{requiredProperty}'",
468             INSTANCE_ARRAY_EXPECTED() => 'Value must be an array',
469             INSTANCE_MIN_ITEMS() =>
470             'Array has {actualCount} items, minimum is {minItems}',
471             INSTANCE_MAX_ITEMS() =>
472             'Array has {actualCount} items, maximum is {maxItems}',
473             INSTANCE_MIN_CONTAINS() =>
474             'Array must contain at least {minContains} matching items (found {actualCount})',
475             INSTANCE_MAX_CONTAINS() =>
476             'Array must contain at most {maxContains} matching items (found {actualCount})',
477             INSTANCE_SET_EXPECTED() => 'Value must be an array (set)',
478             INSTANCE_SET_DUPLICATE() => 'Set contains duplicate value at index {index}',
479             INSTANCE_MAP_EXPECTED() => 'Value must be an object (map)',
480             INSTANCE_MAP_MIN_ENTRIES() =>
481             'Map has {actualCount} entries, minimum is {minProperties}',
482             INSTANCE_MAP_MAX_ENTRIES() =>
483             'Map has {actualCount} entries, maximum is {maxProperties}',
484             INSTANCE_TUPLE_EXPECTED() => 'Value must be an array (tuple)',
485             INSTANCE_TUPLE_LENGTH_MISMATCH() =>
486             'Tuple has {actualCount} items but schema defines {expectedCount}',
487             INSTANCE_TUPLE_ADDITIONAL_ITEMS() =>
488             'Tuple has {actualCount} items but only {expectedCount} are defined',
489             INSTANCE_CHOICE_EXPECTED() => 'Value must be an object (choice)',
490             INSTANCE_CHOICE_MISSING_CHOICES() => "Choice schema must have 'choices'",
491             INSTANCE_CHOICE_SELECTOR_MISSING() =>
492             'Choice requires selector property: {selector}',
493             INSTANCE_CHOICE_SELECTOR_NOT_STRING() => 'Selector value must be a string',
494             INSTANCE_CHOICE_UNKNOWN() => 'Unknown choice: {choiceName}',
495             INSTANCE_CHOICE_NO_MATCH() => 'Value does not match any choice option',
496             INSTANCE_CHOICE_MULTIPLE_MATCHES() =>
497             'Value matches {matchCount} choices (should match exactly one)',
498             INSTANCE_DATE_EXPECTED() => 'Date must be a string',
499             INSTANCE_DATE_FORMAT_INVALID() => 'Invalid date format: {value}',
500             INSTANCE_TIME_EXPECTED() => 'Time must be a string',
501             INSTANCE_TIME_FORMAT_INVALID() => 'Invalid time format: {value}',
502             INSTANCE_DATETIME_EXPECTED() => 'DateTime must be a string',
503             INSTANCE_DATETIME_FORMAT_INVALID() => 'Invalid datetime format: {value}',
504             INSTANCE_DURATION_EXPECTED() => 'Duration must be a string',
505             INSTANCE_DURATION_FORMAT_INVALID() => 'Invalid duration format: {value}',
506             INSTANCE_UUID_EXPECTED() => 'UUID must be a string',
507             INSTANCE_UUID_FORMAT_INVALID() => 'Invalid UUID format: {value}',
508             INSTANCE_URI_EXPECTED() => 'URI must be a string',
509             INSTANCE_URI_FORMAT_INVALID() => 'Invalid URI format: {value}',
510             INSTANCE_URI_MISSING_SCHEME() => 'URI must have a scheme: {value}',
511             INSTANCE_BINARY_EXPECTED() => 'Binary must be a base64 string',
512             INSTANCE_BINARY_ENCODING_INVALID() => 'Invalid base64 encoding',
513             INSTANCE_JSONPOINTER_EXPECTED() => 'JSON Pointer must be a string',
514             INSTANCE_JSONPOINTER_FORMAT_INVALID() =>
515             'Invalid JSON Pointer format: {value}',
516             INSTANCE_DECIMAL_EXPECTED() => 'Value must be a valid {typeName}',
517             INSTANCE_STRING_NOT_EXPECTED() =>
518             'String value not expected for type {typeName}',
519             INSTANCE_CUSTOM_TYPE_NOT_SUPPORTED() =>
520             'Custom type reference not yet supported: {typeName}',
521             );
522              
523             =head1 FUNCTIONS
524              
525             =head2 format_error_message($code, %params)
526              
527             Formats an error message with the given parameters.
528              
529             my $message = format_error_message(SCHEMA_TYPE_INVALID, typeName => 'foo');
530             # Returns: "Invalid type: 'foo'"
531              
532             =cut
533              
534             sub format_error_message {
535 1     1 1 7697 my ( $code, %params ) = @_;
536 1   33     6 my $template = $ERROR_MESSAGES{$code} // "Unknown error: $code";
537              
538             # Replace placeholders with parameter values
539 1         3 for my $key ( keys %params ) {
540 1   50     3 my $value = $params{$key} // '';
541 1         21 $template =~ s/\{$key\}/$value/g;
542             }
543              
544 1         4 return $template;
545             }
546              
547             push @EXPORT_OK, 'format_error_message';
548             push @{ $EXPORT_TAGS{all} }, 'format_error_message';
549              
550             1;
551              
552             __END__