5
5
package jsonschema
6
6
7
7
import (
8
+ "context"
8
9
"encoding/json"
9
10
"fmt"
10
11
"io"
@@ -44,7 +45,7 @@ type Compiler struct {
44
45
// LoadURL loads the document at given URL.
45
46
//
46
47
// If nil, package global LoadURL is used.
47
- LoadURL func (s string ) (io.ReadCloser , error )
48
+ LoadURL func (ctx context. Context , s string ) (io.ReadCloser , error )
48
49
}
49
50
50
51
// NewCompiler returns a json-schema Compiler object.
@@ -81,8 +82,8 @@ func (c *Compiler) AddResource(url string, r io.Reader) error {
81
82
82
83
// MustCompile is like Compile but panics if the url cannot be compiled to *Schema.
83
84
// It simplifies safe initialization of global variables holding compiled Schemas.
84
- func (c * Compiler ) MustCompile (url string ) * Schema {
85
- s , err := c .Compile (url )
85
+ func (c * Compiler ) MustCompile (ctx context. Context , url string ) * Schema {
86
+ s , err := c .Compile (ctx , url )
86
87
if err != nil {
87
88
panic (fmt .Sprintf ("jsonschema: Compile(%q): %s" , url , err ))
88
89
}
@@ -91,10 +92,10 @@ func (c *Compiler) MustCompile(url string) *Schema {
91
92
92
93
// Compile parses json-schema at given url returns, if successful,
93
94
// a Schema object that can be used to match against json.
94
- func (c * Compiler ) Compile (url string ) (* Schema , error ) {
95
+ func (c * Compiler ) Compile (ctx context. Context , url string ) (* Schema , error ) {
95
96
base , fragment := split (url )
96
97
if _ , ok := c .resources [base ]; ! ok {
97
- r , err := c .loadURL (base )
98
+ r , err := c .loadURL (ctx , base )
98
99
if err != nil {
99
100
return nil , err
100
101
}
@@ -125,17 +126,17 @@ func (c *Compiler) Compile(url string) (*Schema, error) {
125
126
r .draft = c .Draft
126
127
}
127
128
}
128
- return c .compileRef (r , r .url , fragment )
129
+ return c .compileRef (ctx , r , r .url , fragment )
129
130
}
130
131
131
- func (c Compiler ) loadURL (s string ) (io.ReadCloser , error ) {
132
+ func (c Compiler ) loadURL (ctx context. Context , s string ) (io.ReadCloser , error ) {
132
133
if c .LoadURL != nil {
133
- return c .LoadURL (s )
134
+ return c .LoadURL (ctx , s )
134
135
}
135
- return LoadURL (s )
136
+ return LoadURL (ctx , s )
136
137
}
137
138
138
- func (c * Compiler ) compileRef (r * resource , base , ref string ) (* Schema , error ) {
139
+ func (c * Compiler ) compileRef (ctx context. Context , r * resource , base , ref string ) (* Schema , error ) {
139
140
var err error
140
141
if rootFragment (ref ) {
141
142
if _ , ok := r .schemas ["#" ]; ! ok {
@@ -144,7 +145,7 @@ func (c *Compiler) compileRef(r *resource, base, ref string) (*Schema, error) {
144
145
}
145
146
s := & Schema {URL : r .url , Ptr : "#" }
146
147
r .schemas ["#" ] = s
147
- if _ , err := c .compile (r , s , base , r .doc ); err != nil {
148
+ if _ , err := c .compile (ctx , r , s , base , r .doc ); err != nil {
148
149
return nil , err
149
150
}
150
151
}
@@ -161,7 +162,7 @@ func (c *Compiler) compileRef(r *resource, base, ref string) (*Schema, error) {
161
162
return nil , err
162
163
}
163
164
r .schemas [ref ] = & Schema {URL : base , Ptr : ref }
164
- if _ , err := c .compile (r , r .schemas [ref ], ptrBase , doc ); err != nil {
165
+ if _ , err := c .compile (ctx , r , r .schemas [ref ], ptrBase , doc ); err != nil {
165
166
return nil , err
166
167
}
167
168
}
@@ -187,7 +188,7 @@ func (c *Compiler) compileRef(r *resource, base, ref string) (*Schema, error) {
187
188
u , f := split (refURL )
188
189
s := & Schema {URL : u , Ptr : f }
189
190
r .schemas [refURL ] = s
190
- if err := c .compileMap (r , s , refURL , v ); err != nil {
191
+ if err := c .compileMap (ctx , r , s , refURL , v ); err != nil {
191
192
return nil , err
192
193
}
193
194
return s , nil
@@ -197,10 +198,10 @@ func (c *Compiler) compileRef(r *resource, base, ref string) (*Schema, error) {
197
198
if base == r .url {
198
199
return nil , fmt .Errorf ("invalid ref: %q" , refURL )
199
200
}
200
- return c .Compile (refURL )
201
+ return c .Compile (ctx , refURL )
201
202
}
202
203
203
- func (c * Compiler ) compile (r * resource , s * Schema , base string , m interface {}) (* Schema , error ) {
204
+ func (c * Compiler ) compile (ctx context. Context , r * resource , s * Schema , base string , m interface {}) (* Schema , error ) {
204
205
if s == nil {
205
206
s = new (Schema )
206
207
s .URL , _ = split (base )
@@ -210,11 +211,11 @@ func (c *Compiler) compile(r *resource, s *Schema, base string, m interface{}) (
210
211
s .Always = & m
211
212
return s , nil
212
213
default :
213
- return s , c .compileMap (r , s , base , m .(map [string ]interface {}))
214
+ return s , c .compileMap (ctx , r , s , base , m .(map [string ]interface {}))
214
215
}
215
216
}
216
217
217
- func (c * Compiler ) compileMap (r * resource , s * Schema , base string , m map [string ]interface {}) error {
218
+ func (c * Compiler ) compileMap (ctx context. Context , r * resource , s * Schema , base string , m map [string ]interface {}) error {
218
219
var err error
219
220
220
221
if id , ok := m [r .draft .id ]; ok {
@@ -225,7 +226,7 @@ func (c *Compiler) compileMap(r *resource, s *Schema, base string, m map[string]
225
226
226
227
if ref , ok := m ["$ref" ]; ok {
227
228
b , _ := split (base )
228
- s .Ref , err = c .compileRef (r , b , ref .(string ))
229
+ s .Ref , err = c .compileRef (ctx , r , b , ref .(string ))
229
230
if err != nil {
230
231
return err
231
232
}
@@ -267,7 +268,7 @@ func (c *Compiler) compileMap(r *resource, s *Schema, base string, m map[string]
267
268
268
269
loadSchema := func (pname string ) (* Schema , error ) {
269
270
if pvalue , ok := m [pname ]; ok {
270
- return c .compile (r , nil , base , pvalue )
271
+ return c .compile (ctx , r , nil , base , pvalue )
271
272
}
272
273
return nil , nil
273
274
}
@@ -281,7 +282,7 @@ func (c *Compiler) compileMap(r *resource, s *Schema, base string, m map[string]
281
282
pvalue := pvalue .([]interface {})
282
283
schemas := make ([]* Schema , len (pvalue ))
283
284
for i , v := range pvalue {
284
- sch , err := c .compile (r , nil , base , v )
285
+ sch , err := c .compile (ctx , r , nil , base , v )
285
286
if err != nil {
286
287
return nil , err
287
288
}
@@ -318,7 +319,7 @@ func (c *Compiler) compileMap(r *resource, s *Schema, base string, m map[string]
318
319
props := props .(map [string ]interface {})
319
320
s .Properties = make (map [string ]* Schema , len (props ))
320
321
for pname , pmap := range props {
321
- s .Properties [pname ], err = c .compile (r , nil , base , pmap )
322
+ s .Properties [pname ], err = c .compile (ctx , r , nil , base , pmap )
322
323
if err != nil {
323
324
return err
324
325
}
@@ -333,7 +334,7 @@ func (c *Compiler) compileMap(r *resource, s *Schema, base string, m map[string]
333
334
patternProps := patternProps .(map [string ]interface {})
334
335
s .PatternProperties = make (map [* regexp.Regexp ]* Schema , len (patternProps ))
335
336
for pattern , pmap := range patternProps {
336
- s .PatternProperties [regexp .MustCompile (pattern )], err = c .compile (r , nil , base , pmap )
337
+ s .PatternProperties [regexp .MustCompile (pattern )], err = c .compile (ctx , r , nil , base , pmap )
337
338
if err != nil {
338
339
return err
339
340
}
@@ -347,7 +348,7 @@ func (c *Compiler) compileMap(r *resource, s *Schema, base string, m map[string]
347
348
s .AdditionalProperties = false
348
349
}
349
350
case map [string ]interface {}:
350
- s .AdditionalProperties , err = c .compile (r , nil , base , additionalProps )
351
+ s .AdditionalProperties , err = c .compile (ctx , r , nil , base , additionalProps )
351
352
if err != nil {
352
353
return err
353
354
}
@@ -362,7 +363,7 @@ func (c *Compiler) compileMap(r *resource, s *Schema, base string, m map[string]
362
363
case []interface {}:
363
364
s .Dependencies [pname ] = toStrings (pvalue )
364
365
default :
365
- s .Dependencies [pname ], err = c .compile (r , nil , base , pvalue )
366
+ s .Dependencies [pname ], err = c .compile (ctx , r , nil , base , pvalue )
366
367
if err != nil {
367
368
return err
368
369
}
@@ -388,7 +389,7 @@ func (c *Compiler) compileMap(r *resource, s *Schema, base string, m map[string]
388
389
case bool :
389
390
s .AdditionalItems = additionalItems
390
391
case map [string ]interface {}:
391
- s .AdditionalItems , err = c .compile (r , nil , base , additionalItems )
392
+ s .AdditionalItems , err = c .compile (ctx , r , nil , base , additionalItems )
392
393
if err != nil {
393
394
return err
394
395
}
@@ -397,7 +398,7 @@ func (c *Compiler) compileMap(r *resource, s *Schema, base string, m map[string]
397
398
s .AdditionalItems = true
398
399
}
399
400
default :
400
- s .Items , err = c .compile (r , nil , base , items )
401
+ s .Items , err = c .compile (ctx , r , nil , base , items )
401
402
if err != nil {
402
403
return err
403
404
}
0 commit comments