1 // Copyright 2015 xeipuuv ( https://github.com/xeipuuv ) 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 // author xeipuuv 16 // author-github https://github.com/xeipuuv 17 // author-mail xeipuuv@gmail.com 18 // 19 // repository-name gojsonschema 20 // repository-desc An implementation of JSON Schema, based on IETF's draft v4 - Go language. 21 // 22 // description Contains const string and messages. 23 // 24 // created 01-01-2015 25 26 package gojsonschema 27 28 type ( 29 // locale is an interface for defining custom error strings 30 locale interface { 31 32 // False returns a format-string for "false" schema validation errors 33 False() string 34 35 // Required returns a format-string for "required" schema validation errors 36 Required() string 37 38 // InvalidType returns a format-string for "invalid type" schema validation errors 39 InvalidType() string 40 41 // NumberAnyOf returns a format-string for "anyOf" schema validation errors 42 NumberAnyOf() string 43 44 // NumberOneOf returns a format-string for "oneOf" schema validation errors 45 NumberOneOf() string 46 47 // NumberAllOf returns a format-string for "allOf" schema validation errors 48 NumberAllOf() string 49 50 // NumberNot returns a format-string to format a NumberNotError 51 NumberNot() string 52 53 // MissingDependency returns a format-string for "missing dependency" schema validation errors 54 MissingDependency() string 55 56 // Internal returns a format-string for internal errors 57 Internal() string 58 59 // Const returns a format-string to format a ConstError 60 Const() string 61 62 // Enum returns a format-string to format an EnumError 63 Enum() string 64 65 // ArrayNotEnoughItems returns a format-string to format an error for arrays having not enough items to match positional list of schema 66 ArrayNotEnoughItems() string 67 68 // ArrayNoAdditionalItems returns a format-string to format an ArrayNoAdditionalItemsError 69 ArrayNoAdditionalItems() string 70 71 // ArrayMinItems returns a format-string to format an ArrayMinItemsError 72 ArrayMinItems() string 73 74 // ArrayMaxItems returns a format-string to format an ArrayMaxItemsError 75 ArrayMaxItems() string 76 77 // Unique returns a format-string to format an ItemsMustBeUniqueError 78 Unique() string 79 80 // ArrayContains returns a format-string to format an ArrayContainsError 81 ArrayContains() string 82 83 // ArrayMinProperties returns a format-string to format an ArrayMinPropertiesError 84 ArrayMinProperties() string 85 86 // ArrayMaxProperties returns a format-string to format an ArrayMaxPropertiesError 87 ArrayMaxProperties() string 88 89 // AdditionalPropertyNotAllowed returns a format-string to format an AdditionalPropertyNotAllowedError 90 AdditionalPropertyNotAllowed() string 91 92 // InvalidPropertyPattern returns a format-string to format an InvalidPropertyPatternError 93 InvalidPropertyPattern() string 94 95 // InvalidPropertyName returns a format-string to format an InvalidPropertyNameError 96 InvalidPropertyName() string 97 98 // StringGTE returns a format-string to format an StringLengthGTEError 99 StringGTE() string 100 101 // StringLTE returns a format-string to format an StringLengthLTEError 102 StringLTE() string 103 104 // DoesNotMatchPattern returns a format-string to format an DoesNotMatchPatternError 105 DoesNotMatchPattern() string 106 107 // DoesNotMatchFormat returns a format-string to format an DoesNotMatchFormatError 108 DoesNotMatchFormat() string 109 110 // MultipleOf returns a format-string to format an MultipleOfError 111 MultipleOf() string 112 113 // NumberGTE returns a format-string to format an NumberGTEError 114 NumberGTE() string 115 116 // NumberGT returns a format-string to format an NumberGTError 117 NumberGT() string 118 119 // NumberLTE returns a format-string to format an NumberLTEError 120 NumberLTE() string 121 122 // NumberLT returns a format-string to format an NumberLTError 123 NumberLT() string 124 125 // Schema validations 126 127 // RegexPattern returns a format-string to format a regex-pattern error 128 RegexPattern() string 129 130 // GreaterThanZero returns a format-string to format an error where a number must be greater than zero 131 GreaterThanZero() string 132 133 // MustBeOfA returns a format-string to format an error where a value is of the wrong type 134 MustBeOfA() string 135 136 // MustBeOfAn returns a format-string to format an error where a value is of the wrong type 137 MustBeOfAn() string 138 139 // CannotBeUsedWithout returns a format-string to format a "cannot be used without" error 140 CannotBeUsedWithout() string 141 142 // CannotBeGT returns a format-string to format an error where a value are greater than allowed 143 CannotBeGT() string 144 145 // MustBeOfType returns a format-string to format an error where a value does not match the required type 146 MustBeOfType() string 147 148 // MustBeValidRegex returns a format-string to format an error where a regex is invalid 149 MustBeValidRegex() string 150 151 // MustBeValidFormat returns a format-string to format an error where a value does not match the expected format 152 MustBeValidFormat() string 153 154 // MustBeGTEZero returns a format-string to format an error where a value must be greater or equal than 0 155 MustBeGTEZero() string 156 157 // KeyCannotBeGreaterThan returns a format-string to format an error where a key is greater than the maximum allowed 158 KeyCannotBeGreaterThan() string 159 160 // KeyItemsMustBeOfType returns a format-string to format an error where a key is of the wrong type 161 KeyItemsMustBeOfType() string 162 163 // KeyItemsMustBeUnique returns a format-string to format an error where keys are not unique 164 KeyItemsMustBeUnique() string 165 166 // ReferenceMustBeCanonical returns a format-string to format a "reference must be canonical" error 167 ReferenceMustBeCanonical() string 168 169 // NotAValidType returns a format-string to format an invalid type error 170 NotAValidType() string 171 172 // Duplicated returns a format-string to format an error where types are duplicated 173 Duplicated() string 174 175 // HttpBadStatus returns a format-string for errors when loading a schema using HTTP 176 HttpBadStatus() string 177 178 // ParseError returns a format-string for JSON parsing errors 179 ParseError() string 180 181 // ConditionThen returns a format-string for ConditionThenError errors 182 ConditionThen() string 183 184 // ConditionElse returns a format-string for ConditionElseError errors 185 ConditionElse() string 186 187 // ErrorFormat returns a format string for errors 188 ErrorFormat() string 189 } 190 191 // DefaultLocale is the default locale for this package 192 DefaultLocale struct{} 193 ) 194 195 // False returns a format-string for "false" schema validation errors 196 func (l DefaultLocale) False() string { 197 return "False always fails validation" 198 } 199 200 // Required returns a format-string for "required" schema validation errors 201 func (l DefaultLocale) Required() string { 202 return `{{.property}} is required` 203 } 204 205 // InvalidType returns a format-string for "invalid type" schema validation errors 206 func (l DefaultLocale) InvalidType() string { 207 return `Invalid type. Expected: {{.expected}}, given: {{.given}}` 208 } 209 210 // NumberAnyOf returns a format-string for "anyOf" schema validation errors 211 func (l DefaultLocale) NumberAnyOf() string { 212 return `Must validate at least one schema (anyOf)` 213 } 214 215 // NumberOneOf returns a format-string for "oneOf" schema validation errors 216 func (l DefaultLocale) NumberOneOf() string { 217 return `Must validate one and only one schema (oneOf)` 218 } 219 220 // NumberAllOf returns a format-string for "allOf" schema validation errors 221 func (l DefaultLocale) NumberAllOf() string { 222 return `Must validate all the schemas (allOf)` 223 } 224 225 // NumberNot returns a format-string to format a NumberNotError 226 func (l DefaultLocale) NumberNot() string { 227 return `Must not validate the schema (not)` 228 } 229 230 // MissingDependency returns a format-string for "missing dependency" schema validation errors 231 func (l DefaultLocale) MissingDependency() string { 232 return `Has a dependency on {{.dependency}}` 233 } 234 235 // Internal returns a format-string for internal errors 236 func (l DefaultLocale) Internal() string { 237 return `Internal Error {{.error}}` 238 } 239 240 // Const returns a format-string to format a ConstError 241 func (l DefaultLocale) Const() string { 242 return `{{.field}} does not match: {{.allowed}}` 243 } 244 245 // Enum returns a format-string to format an EnumError 246 func (l DefaultLocale) Enum() string { 247 return `{{.field}} must be one of the following: {{.allowed}}` 248 } 249 250 // ArrayNoAdditionalItems returns a format-string to format an ArrayNoAdditionalItemsError 251 func (l DefaultLocale) ArrayNoAdditionalItems() string { 252 return `No additional items allowed on array` 253 } 254 255 // ArrayNotEnoughItems returns a format-string to format an error for arrays having not enough items to match positional list of schema 256 func (l DefaultLocale) ArrayNotEnoughItems() string { 257 return `Not enough items on array to match positional list of schema` 258 } 259 260 // ArrayMinItems returns a format-string to format an ArrayMinItemsError 261 func (l DefaultLocale) ArrayMinItems() string { 262 return `Array must have at least {{.min}} items` 263 } 264 265 // ArrayMaxItems returns a format-string to format an ArrayMaxItemsError 266 func (l DefaultLocale) ArrayMaxItems() string { 267 return `Array must have at most {{.max}} items` 268 } 269 270 // Unique returns a format-string to format an ItemsMustBeUniqueError 271 func (l DefaultLocale) Unique() string { 272 return `{{.type}} items[{{.i}},{{.j}}] must be unique` 273 } 274 275 // ArrayContains returns a format-string to format an ArrayContainsError 276 func (l DefaultLocale) ArrayContains() string { 277 return `At least one of the items must match` 278 } 279 280 // ArrayMinProperties returns a format-string to format an ArrayMinPropertiesError 281 func (l DefaultLocale) ArrayMinProperties() string { 282 return `Must have at least {{.min}} properties` 283 } 284 285 // ArrayMaxProperties returns a format-string to format an ArrayMaxPropertiesError 286 func (l DefaultLocale) ArrayMaxProperties() string { 287 return `Must have at most {{.max}} properties` 288 } 289 290 // AdditionalPropertyNotAllowed returns a format-string to format an AdditionalPropertyNotAllowedError 291 func (l DefaultLocale) AdditionalPropertyNotAllowed() string { 292 return `Additional property {{.property}} is not allowed` 293 } 294 295 // InvalidPropertyPattern returns a format-string to format an InvalidPropertyPatternError 296 func (l DefaultLocale) InvalidPropertyPattern() string { 297 return `Property "{{.property}}" does not match pattern {{.pattern}}` 298 } 299 300 // InvalidPropertyName returns a format-string to format an InvalidPropertyNameError 301 func (l DefaultLocale) InvalidPropertyName() string { 302 return `Property name of "{{.property}}" does not match` 303 } 304 305 // StringGTE returns a format-string to format an StringLengthGTEError 306 func (l DefaultLocale) StringGTE() string { 307 return `String length must be greater than or equal to {{.min}}` 308 } 309 310 // StringLTE returns a format-string to format an StringLengthLTEError 311 func (l DefaultLocale) StringLTE() string { 312 return `String length must be less than or equal to {{.max}}` 313 } 314 315 // DoesNotMatchPattern returns a format-string to format an DoesNotMatchPatternError 316 func (l DefaultLocale) DoesNotMatchPattern() string { 317 return `Does not match pattern '{{.pattern}}'` 318 } 319 320 // DoesNotMatchFormat returns a format-string to format an DoesNotMatchFormatError 321 func (l DefaultLocale) DoesNotMatchFormat() string { 322 return `Does not match format '{{.format}}'` 323 } 324 325 // MultipleOf returns a format-string to format an MultipleOfError 326 func (l DefaultLocale) MultipleOf() string { 327 return `Must be a multiple of {{.multiple}}` 328 } 329 330 // NumberGTE returns the format string to format a NumberGTEError 331 func (l DefaultLocale) NumberGTE() string { 332 return `Must be greater than or equal to {{.min}}` 333 } 334 335 // NumberGT returns the format string to format a NumberGTError 336 func (l DefaultLocale) NumberGT() string { 337 return `Must be greater than {{.min}}` 338 } 339 340 // NumberLTE returns the format string to format a NumberLTEError 341 func (l DefaultLocale) NumberLTE() string { 342 return `Must be less than or equal to {{.max}}` 343 } 344 345 // NumberLT returns the format string to format a NumberLTError 346 func (l DefaultLocale) NumberLT() string { 347 return `Must be less than {{.max}}` 348 } 349 350 // Schema validators 351 352 // RegexPattern returns a format-string to format a regex-pattern error 353 func (l DefaultLocale) RegexPattern() string { 354 return `Invalid regex pattern '{{.pattern}}'` 355 } 356 357 // GreaterThanZero returns a format-string to format an error where a number must be greater than zero 358 func (l DefaultLocale) GreaterThanZero() string { 359 return `{{.number}} must be strictly greater than 0` 360 } 361 362 // MustBeOfA returns a format-string to format an error where a value is of the wrong type 363 func (l DefaultLocale) MustBeOfA() string { 364 return `{{.x}} must be of a {{.y}}` 365 } 366 367 // MustBeOfAn returns a format-string to format an error where a value is of the wrong type 368 func (l DefaultLocale) MustBeOfAn() string { 369 return `{{.x}} must be of an {{.y}}` 370 } 371 372 // CannotBeUsedWithout returns a format-string to format a "cannot be used without" error 373 func (l DefaultLocale) CannotBeUsedWithout() string { 374 return `{{.x}} cannot be used without {{.y}}` 375 } 376 377 // CannotBeGT returns a format-string to format an error where a value are greater than allowed 378 func (l DefaultLocale) CannotBeGT() string { 379 return `{{.x}} cannot be greater than {{.y}}` 380 } 381 382 // MustBeOfType returns a format-string to format an error where a value does not match the required type 383 func (l DefaultLocale) MustBeOfType() string { 384 return `{{.key}} must be of type {{.type}}` 385 } 386 387 // MustBeValidRegex returns a format-string to format an error where a regex is invalid 388 func (l DefaultLocale) MustBeValidRegex() string { 389 return `{{.key}} must be a valid regex` 390 } 391 392 // MustBeValidFormat returns a format-string to format an error where a value does not match the expected format 393 func (l DefaultLocale) MustBeValidFormat() string { 394 return `{{.key}} must be a valid format {{.given}}` 395 } 396 397 // MustBeGTEZero returns a format-string to format an error where a value must be greater or equal than 0 398 func (l DefaultLocale) MustBeGTEZero() string { 399 return `{{.key}} must be greater than or equal to 0` 400 } 401 402 // KeyCannotBeGreaterThan returns a format-string to format an error where a value is greater than the maximum allowed 403 func (l DefaultLocale) KeyCannotBeGreaterThan() string { 404 return `{{.key}} cannot be greater than {{.y}}` 405 } 406 407 // KeyItemsMustBeOfType returns a format-string to format an error where a key is of the wrong type 408 func (l DefaultLocale) KeyItemsMustBeOfType() string { 409 return `{{.key}} items must be {{.type}}` 410 } 411 412 // KeyItemsMustBeUnique returns a format-string to format an error where keys are not unique 413 func (l DefaultLocale) KeyItemsMustBeUnique() string { 414 return `{{.key}} items must be unique` 415 } 416 417 // ReferenceMustBeCanonical returns a format-string to format a "reference must be canonical" error 418 func (l DefaultLocale) ReferenceMustBeCanonical() string { 419 return `Reference {{.reference}} must be canonical` 420 } 421 422 // NotAValidType returns a format-string to format an invalid type error 423 func (l DefaultLocale) NotAValidType() string { 424 return `has a primitive type that is NOT VALID -- given: {{.given}} Expected valid values are:{{.expected}}` 425 } 426 427 // Duplicated returns a format-string to format an error where types are duplicated 428 func (l DefaultLocale) Duplicated() string { 429 return `{{.type}} type is duplicated` 430 } 431 432 // HttpBadStatus returns a format-string for errors when loading a schema using HTTP 433 func (l DefaultLocale) HttpBadStatus() string { 434 return `Could not read schema from HTTP, response status is {{.status}}` 435 } 436 437 // ErrorFormat returns a format string for errors 438 // Replacement options: field, description, context, value 439 func (l DefaultLocale) ErrorFormat() string { 440 return `{{.field}}: {{.description}}` 441 } 442 443 // ParseError returns a format-string for JSON parsing errors 444 func (l DefaultLocale) ParseError() string { 445 return `Expected: {{.expected}}, given: Invalid JSON` 446 } 447 448 // ConditionThen returns a format-string for ConditionThenError errors 449 // If/Else 450 func (l DefaultLocale) ConditionThen() string { 451 return `Must validate "then" as "if" was valid` 452 } 453 454 // ConditionElse returns a format-string for ConditionElseError errors 455 func (l DefaultLocale) ConditionElse() string { 456 return `Must validate "else" as "if" was not valid` 457 } 458 459 // constants 460 const ( 461 STRING_NUMBER = "number" 462 STRING_ARRAY_OF_STRINGS = "array of strings" 463 STRING_ARRAY_OF_SCHEMAS = "array of schemas" 464 STRING_SCHEMA = "valid schema" 465 STRING_SCHEMA_OR_ARRAY_OF_STRINGS = "schema or array of strings" 466 STRING_PROPERTIES = "properties" 467 STRING_DEPENDENCY = "dependency" 468 STRING_PROPERTY = "property" 469 STRING_UNDEFINED = "undefined" 470 STRING_CONTEXT_ROOT = "(root)" 471 STRING_ROOT_SCHEMA_PROPERTY = "(root)" 472 ) 473