forked from xeipuuv/gojsonschema
-
Notifications
You must be signed in to change notification settings - Fork 0
/
schema.go
175 lines (134 loc) · 3.8 KB
/
schema.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
// Copyright 2013 sigu-399 ( https://github.com/sigu-399 )
//
// 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 sigu-399
// author-github https://github.com/sigu-399
// author-mail sigu.399@gmail.com
//
// repository-name gojsonschema
// repository-desc An implementation of JSON Schema, based on IETF's draft v4 - Go language.
//
// description Defines the structure of a schema.
// A schema can have sub-schemas.
//
// created 27-02-2013
package gojsonschema
import (
"errors"
"github.com/sigu-399/gojsonreference"
"regexp"
)
type jsonSchema struct {
// basic schema meta properties
id *string
title *string
description *string
// Types associated with the
types jsonSchemaType
// Reference url
ref *gojsonreference.JsonReference
// Schema referenced
refSchema *jsonSchema
schema *gojsonreference.JsonReference
definitions map[string]*jsonSchema
// hierarchy
parent *jsonSchema
definitionsChildren []*jsonSchema
itemsChildren []*jsonSchema
itemsChildrenIsSingleSchema bool
propertiesChildren []*jsonSchema
property string
// validation : number / integer
multipleOf *float64
maximum *float64
exclusiveMaximum bool
minimum *float64
exclusiveMinimum bool
// validation : string
minLength *int
maxLength *int
pattern *regexp.Regexp
// validation : object
minProperties *int
maxProperties *int
required []string
dependencies map[string]interface{}
additionalProperties interface{}
patternProperties map[string]*jsonSchema
// validation : array
minItems *int
maxItems *int
uniqueItems bool
additionalItems interface{}
// validation : all
enum []string
// validation : schema
oneOf []*jsonSchema
anyOf []*jsonSchema
allOf []*jsonSchema
not *jsonSchema
}
func (s *jsonSchema) AddEnum(i interface{}) error {
is, err := marshalToString(i)
if err != nil {
return err
}
if isStringInSlice(s.enum, *is) {
return errors.New("enum items must be unique")
}
s.enum = append(s.enum, *is)
return nil
}
func (s *jsonSchema) AddOneOf(schema *jsonSchema) {
s.oneOf = append(s.oneOf, schema)
}
func (s *jsonSchema) AddAllOf(schema *jsonSchema) {
s.allOf = append(s.allOf, schema)
}
func (s *jsonSchema) AddAnyOf(schema *jsonSchema) {
s.anyOf = append(s.anyOf, schema)
}
func (s *jsonSchema) SetNot(schema *jsonSchema) {
s.not = schema
}
func (s *jsonSchema) HasEnum(i interface{}) (bool, error) {
is, err := marshalToString(i)
if err != nil {
return false, err
}
return isStringInSlice(s.enum, *is), nil
}
func (s *jsonSchema) AddRequired(value string) error {
if isStringInSlice(s.required, value) {
return errors.New("required items must be unique")
}
s.required = append(s.required, value)
return nil
}
func (s *jsonSchema) AddDefinitionChild(child *jsonSchema) {
s.definitionsChildren = append(s.definitionsChildren, child)
}
func (s *jsonSchema) AddItemsChild(child *jsonSchema) {
s.itemsChildren = append(s.itemsChildren, child)
}
func (s *jsonSchema) AddPropertiesChild(child *jsonSchema) {
s.propertiesChildren = append(s.propertiesChildren, child)
}
func (s *jsonSchema) HasProperty(name string) bool {
for _, v := range s.propertiesChildren {
if v.property == name {
return true
}
}
return false
}