55package jsonschema
66
77import (
8+ "context"
89 "encoding/json"
910 "fmt"
1011 "io"
@@ -44,7 +45,7 @@ type Compiler struct {
4445 // LoadURL loads the document at given URL.
4546 //
4647 // 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 )
4849}
4950
5051// NewCompiler returns a json-schema Compiler object.
@@ -81,8 +82,8 @@ func (c *Compiler) AddResource(url string, r io.Reader) error {
8182
8283// MustCompile is like Compile but panics if the url cannot be compiled to *Schema.
8384// 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 )
8687 if err != nil {
8788 panic (fmt .Sprintf ("jsonschema: Compile(%q): %s" , url , err ))
8889 }
@@ -91,10 +92,10 @@ func (c *Compiler) MustCompile(url string) *Schema {
9192
9293// Compile parses json-schema at given url returns, if successful,
9394// 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 ) {
9596 base , fragment := split (url )
9697 if _ , ok := c .resources [base ]; ! ok {
97- r , err := c .loadURL (base )
98+ r , err := c .loadURL (ctx , base )
9899 if err != nil {
99100 return nil , err
100101 }
@@ -125,17 +126,17 @@ func (c *Compiler) Compile(url string) (*Schema, error) {
125126 r .draft = c .Draft
126127 }
127128 }
128- return c .compileRef (r , r .url , fragment )
129+ return c .compileRef (ctx , r , r .url , fragment )
129130}
130131
131- func (c Compiler ) loadURL (s string ) (io.ReadCloser , error ) {
132+ func (c Compiler ) loadURL (ctx context. Context , s string ) (io.ReadCloser , error ) {
132133 if c .LoadURL != nil {
133- return c .LoadURL (s )
134+ return c .LoadURL (ctx , s )
134135 }
135- return LoadURL (s )
136+ return LoadURL (ctx , s )
136137}
137138
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 ) {
139140 var err error
140141 if rootFragment (ref ) {
141142 if _ , ok := r .schemas ["#" ]; ! ok {
@@ -144,7 +145,7 @@ func (c *Compiler) compileRef(r *resource, base, ref string) (*Schema, error) {
144145 }
145146 s := & Schema {URL : r .url , Ptr : "#" }
146147 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 {
148149 return nil , err
149150 }
150151 }
@@ -161,7 +162,7 @@ func (c *Compiler) compileRef(r *resource, base, ref string) (*Schema, error) {
161162 return nil , err
162163 }
163164 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 {
165166 return nil , err
166167 }
167168 }
@@ -187,7 +188,7 @@ func (c *Compiler) compileRef(r *resource, base, ref string) (*Schema, error) {
187188 u , f := split (refURL )
188189 s := & Schema {URL : u , Ptr : f }
189190 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 {
191192 return nil , err
192193 }
193194 return s , nil
@@ -197,10 +198,10 @@ func (c *Compiler) compileRef(r *resource, base, ref string) (*Schema, error) {
197198 if base == r .url {
198199 return nil , fmt .Errorf ("invalid ref: %q" , refURL )
199200 }
200- return c .Compile (refURL )
201+ return c .Compile (ctx , refURL )
201202}
202203
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 ) {
204205 if s == nil {
205206 s = new (Schema )
206207 s .URL , _ = split (base )
@@ -210,11 +211,11 @@ func (c *Compiler) compile(r *resource, s *Schema, base string, m interface{}) (
210211 s .Always = & m
211212 return s , nil
212213 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 {}))
214215 }
215216}
216217
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 {
218219 var err error
219220
220221 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]
225226
226227 if ref , ok := m ["$ref" ]; ok {
227228 b , _ := split (base )
228- s .Ref , err = c .compileRef (r , b , ref .(string ))
229+ s .Ref , err = c .compileRef (ctx , r , b , ref .(string ))
229230 if err != nil {
230231 return err
231232 }
@@ -267,7 +268,7 @@ func (c *Compiler) compileMap(r *resource, s *Schema, base string, m map[string]
267268
268269 loadSchema := func (pname string ) (* Schema , error ) {
269270 if pvalue , ok := m [pname ]; ok {
270- return c .compile (r , nil , base , pvalue )
271+ return c .compile (ctx , r , nil , base , pvalue )
271272 }
272273 return nil , nil
273274 }
@@ -281,7 +282,7 @@ func (c *Compiler) compileMap(r *resource, s *Schema, base string, m map[string]
281282 pvalue := pvalue .([]interface {})
282283 schemas := make ([]* Schema , len (pvalue ))
283284 for i , v := range pvalue {
284- sch , err := c .compile (r , nil , base , v )
285+ sch , err := c .compile (ctx , r , nil , base , v )
285286 if err != nil {
286287 return nil , err
287288 }
@@ -318,7 +319,7 @@ func (c *Compiler) compileMap(r *resource, s *Schema, base string, m map[string]
318319 props := props .(map [string ]interface {})
319320 s .Properties = make (map [string ]* Schema , len (props ))
320321 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 )
322323 if err != nil {
323324 return err
324325 }
@@ -333,7 +334,7 @@ func (c *Compiler) compileMap(r *resource, s *Schema, base string, m map[string]
333334 patternProps := patternProps .(map [string ]interface {})
334335 s .PatternProperties = make (map [* regexp.Regexp ]* Schema , len (patternProps ))
335336 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 )
337338 if err != nil {
338339 return err
339340 }
@@ -347,7 +348,7 @@ func (c *Compiler) compileMap(r *resource, s *Schema, base string, m map[string]
347348 s .AdditionalProperties = false
348349 }
349350 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 )
351352 if err != nil {
352353 return err
353354 }
@@ -362,7 +363,7 @@ func (c *Compiler) compileMap(r *resource, s *Schema, base string, m map[string]
362363 case []interface {}:
363364 s .Dependencies [pname ] = toStrings (pvalue )
364365 default :
365- s .Dependencies [pname ], err = c .compile (r , nil , base , pvalue )
366+ s .Dependencies [pname ], err = c .compile (ctx , r , nil , base , pvalue )
366367 if err != nil {
367368 return err
368369 }
@@ -388,7 +389,7 @@ func (c *Compiler) compileMap(r *resource, s *Schema, base string, m map[string]
388389 case bool :
389390 s .AdditionalItems = additionalItems
390391 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 )
392393 if err != nil {
393394 return err
394395 }
@@ -397,7 +398,7 @@ func (c *Compiler) compileMap(r *resource, s *Schema, base string, m map[string]
397398 s .AdditionalItems = true
398399 }
399400 default :
400- s .Items , err = c .compile (r , nil , base , items )
401+ s .Items , err = c .compile (ctx , r , nil , base , items )
401402 if err != nil {
402403 return err
403404 }
0 commit comments