123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- // Copyright 2015 xeipuuv ( https://github.com/xeipuuv )
- //
- // Licensed under the Apache License, Version 2.0 (the "License");
- // you may not use this file except in compliance with the License.
- // You may obtain a copy of the License at
- //
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing, software
- // distributed under the License is distributed on an "AS IS" BASIS,
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- // See the License for the specific language governing permissions and
- // limitations under the License.
- // author xeipuuv
- // author-github https://github.com/xeipuuv
- // author-mail [email protected]
- //
- // repository-name gojsonschema
- // repository-desc An implementation of JSON Schema, based on IETF's draft v4 - Go language.
- //
- // description Result and ResultError implementations.
- //
- // created 01-01-2015
- package gojsonschema
- import (
- "fmt"
- "strings"
- )
- type (
- // ErrorDetails is a map of details specific to each error.
- // While the values will vary, every error will contain a "field" value
- ErrorDetails map[string]interface{}
- // ResultError is the interface that library errors must implement
- ResultError interface {
- Field() string
- SetType(string)
- Type() string
- SetContext(*jsonContext)
- Context() *jsonContext
- SetDescription(string)
- Description() string
- SetValue(interface{})
- Value() interface{}
- SetDetails(ErrorDetails)
- Details() ErrorDetails
- }
- // ResultErrorFields holds the fields for each ResultError implementation.
- // ResultErrorFields implements the ResultError interface, so custom errors
- // can be defined by just embedding this type
- ResultErrorFields struct {
- errorType string // A string with the type of error (i.e. invalid_type)
- context *jsonContext // Tree like notation of the part that failed the validation. ex (root).a.b ...
- description string // A human readable error message
- value interface{} // Value given by the JSON file that is the source of the error
- details ErrorDetails
- }
- Result struct {
- errors []ResultError
- // Scores how well the validation matched. Useful in generating
- // better error messages for anyOf and oneOf.
- score int
- }
- )
- // Field outputs the field name without the root context
- // i.e. firstName or person.firstName instead of (root).firstName or (root).person.firstName
- func (v *ResultErrorFields) Field() string {
- if p, ok := v.Details()["property"]; ok {
- if str, isString := p.(string); isString {
- return str
- }
- }
- return strings.TrimPrefix(v.context.String(), STRING_ROOT_SCHEMA_PROPERTY+".")
- }
- func (v *ResultErrorFields) SetType(errorType string) {
- v.errorType = errorType
- }
- func (v *ResultErrorFields) Type() string {
- return v.errorType
- }
- func (v *ResultErrorFields) SetContext(context *jsonContext) {
- v.context = context
- }
- func (v *ResultErrorFields) Context() *jsonContext {
- return v.context
- }
- func (v *ResultErrorFields) SetDescription(description string) {
- v.description = description
- }
- func (v *ResultErrorFields) Description() string {
- return v.description
- }
- func (v *ResultErrorFields) SetValue(value interface{}) {
- v.value = value
- }
- func (v *ResultErrorFields) Value() interface{} {
- return v.value
- }
- func (v *ResultErrorFields) SetDetails(details ErrorDetails) {
- v.details = details
- }
- func (v *ResultErrorFields) Details() ErrorDetails {
- return v.details
- }
- func (v ResultErrorFields) String() string {
- // as a fallback, the value is displayed go style
- valueString := fmt.Sprintf("%v", v.value)
- // marshal the go value value to json
- if v.Value == nil {
- valueString = TYPE_NULL
- } else {
- if vs, err := marshalToJsonString(v.value); err == nil {
- if vs == nil {
- valueString = TYPE_NULL
- } else {
- valueString = *vs
- }
- }
- }
- return formatErrorDescription(Locale.ErrorFormat(), ErrorDetails{
- "context": v.context.String(),
- "description": v.description,
- "value": valueString,
- "field": v.Field(),
- })
- }
- func (v *Result) Valid() bool {
- return len(v.errors) == 0
- }
- func (v *Result) Errors() []ResultError {
- return v.errors
- }
- func (v *Result) addError(err ResultError, context *jsonContext, value interface{}, details ErrorDetails) {
- newError(err, context, value, Locale, details)
- v.errors = append(v.errors, err)
- v.score -= 2 // results in a net -1 when added to the +1 we get at the end of the validation function
- }
- // Used to copy errors from a sub-schema to the main one
- func (v *Result) mergeErrors(otherResult *Result) {
- v.errors = append(v.errors, otherResult.Errors()...)
- v.score += otherResult.score
- }
- func (v *Result) incrementScore() {
- v.score++
- }
|