@@ -287,20 +287,21 @@ func (loader *Loader) resolveComponent(
287
287
path * url.URL ,
288
288
resolved interface {},
289
289
) (
290
+ componentDoc * T ,
290
291
componentPath * url.URL ,
291
292
err error ,
292
293
) {
293
- if doc , ref , componentPath , err = loader .resolveRef (doc , ref , path ); err != nil {
294
- return nil , err
294
+ if componentDoc , ref , componentPath , err = loader .resolveRef (doc , ref , path ); err != nil {
295
+ return nil , nil , err
295
296
}
296
297
297
298
parsedURL , err := url .Parse (ref )
298
299
if err != nil {
299
- return nil , fmt .Errorf ("cannot parse reference: %q: %v" , ref , parsedURL )
300
+ return nil , nil , fmt .Errorf ("cannot parse reference: %q: %v" , ref , parsedURL )
300
301
}
301
302
fragment := parsedURL .Fragment
302
303
if ! strings .HasPrefix (fragment , "/" ) {
303
- return nil , fmt .Errorf ("expected fragment prefix '#/' in URI %q" , ref )
304
+ return nil , nil , fmt .Errorf ("expected fragment prefix '#/' in URI %q" , ref )
304
305
}
305
306
306
307
drill := func (cursor interface {}) (interface {}, error ) {
@@ -318,28 +319,28 @@ func (loader *Loader) resolveComponent(
318
319
return cursor , nil
319
320
}
320
321
var cursor interface {}
321
- if cursor , err = drill (doc ); err != nil {
322
+ if cursor , err = drill (componentDoc ); err != nil {
322
323
if path == nil {
323
- return nil , err
324
+ return nil , nil , err
324
325
}
325
326
var err2 error
326
327
data , err2 := loader .readURL (path )
327
328
if err2 != nil {
328
- return nil , err
329
+ return nil , nil , err
329
330
}
330
331
if err2 = unmarshal (data , & cursor ); err2 != nil {
331
- return nil , err
332
+ return nil , nil , err
332
333
}
333
334
if cursor , err2 = drill (cursor ); err2 != nil || cursor == nil {
334
- return nil , err
335
+ return nil , nil , err
335
336
}
336
337
err = nil
337
338
}
338
339
339
340
switch {
340
341
case reflect .TypeOf (cursor ) == reflect .TypeOf (resolved ):
341
342
reflect .ValueOf (resolved ).Elem ().Set (reflect .ValueOf (cursor ).Elem ())
342
- return componentPath , nil
343
+ return componentDoc , componentPath , nil
343
344
344
345
case reflect .TypeOf (cursor ) == reflect .TypeOf (map [string ]interface {}{}):
345
346
codec := func (got , expect interface {}) error {
@@ -353,12 +354,12 @@ func (loader *Loader) resolveComponent(
353
354
return nil
354
355
}
355
356
if err := codec (cursor , resolved ); err != nil {
356
- return nil , fmt .Errorf ("bad data in %q" , ref )
357
+ return nil , nil , fmt .Errorf ("bad data in %q" , ref )
357
358
}
358
- return componentPath , nil
359
+ return componentDoc , componentPath , nil
359
360
360
361
default :
361
- return nil , fmt .Errorf ("bad data in %q" , ref )
362
+ return nil , nil , fmt .Errorf ("bad data in %q" , ref )
362
363
}
363
364
}
364
365
@@ -429,18 +430,6 @@ func drillIntoField(cursor interface{}, fieldName string) (interface{}, error) {
429
430
}
430
431
}
431
432
432
- func (loader * Loader ) documentPathForRecursiveRef (current * url.URL , resolvedRef string ) * url.URL {
433
- if loader .rootDir == "" {
434
- return current
435
- }
436
-
437
- if resolvedRef == "" {
438
- return & url.URL {Path : loader .rootLocation }
439
- }
440
-
441
- return & url.URL {Path : path .Join (loader .rootDir , resolvedRef )}
442
- }
443
-
444
433
func (loader * Loader ) resolveRef (doc * T , ref string , path * url.URL ) (* T , string , * url.URL , error ) {
445
434
if ref != "" && ref [0 ] == '#' {
446
435
return doc , ref , path , nil
@@ -492,15 +481,15 @@ func (loader *Loader) resolveHeaderRef(doc *T, component *HeaderRef, documentPat
492
481
component .Value = & header
493
482
} else {
494
483
var resolved HeaderRef
495
- componentPath , err := loader .resolveComponent (doc , ref , documentPath , & resolved )
484
+ doc , componentPath , err := loader .resolveComponent (doc , ref , documentPath , & resolved )
496
485
if err != nil {
497
486
return err
498
487
}
499
488
if err := loader .resolveHeaderRef (doc , & resolved , componentPath ); err != nil {
500
489
return err
501
490
}
502
491
component .Value = resolved .Value
503
- documentPath = loader . documentPathForRecursiveRef ( documentPath , resolved . Ref )
492
+ return nil
504
493
}
505
494
}
506
495
value := component .Value
@@ -540,15 +529,15 @@ func (loader *Loader) resolveParameterRef(doc *T, component *ParameterRef, docum
540
529
component .Value = & param
541
530
} else {
542
531
var resolved ParameterRef
543
- componentPath , err := loader .resolveComponent (doc , ref , documentPath , & resolved )
532
+ doc , componentPath , err := loader .resolveComponent (doc , ref , documentPath , & resolved )
544
533
if err != nil {
545
534
return err
546
535
}
547
536
if err := loader .resolveParameterRef (doc , & resolved , componentPath ); err != nil {
548
537
return err
549
538
}
550
539
component .Value = resolved .Value
551
- documentPath = loader . documentPathForRecursiveRef ( documentPath , resolved . Ref )
540
+ return nil
552
541
}
553
542
}
554
543
value := component .Value
@@ -597,15 +586,15 @@ func (loader *Loader) resolveRequestBodyRef(doc *T, component *RequestBodyRef, d
597
586
component .Value = & requestBody
598
587
} else {
599
588
var resolved RequestBodyRef
600
- componentPath , err := loader .resolveComponent (doc , ref , documentPath , & resolved )
589
+ doc , componentPath , err := loader .resolveComponent (doc , ref , documentPath , & resolved )
601
590
if err != nil {
602
591
return err
603
592
}
604
593
if err = loader .resolveRequestBodyRef (doc , & resolved , componentPath ); err != nil {
605
594
return err
606
595
}
607
596
component .Value = resolved .Value
608
- documentPath = loader . documentPathForRecursiveRef ( documentPath , resolved . Ref )
597
+ return nil
609
598
}
610
599
}
611
600
value := component .Value
@@ -659,15 +648,15 @@ func (loader *Loader) resolveResponseRef(doc *T, component *ResponseRef, documen
659
648
component .Value = & resp
660
649
} else {
661
650
var resolved ResponseRef
662
- componentPath , err := loader .resolveComponent (doc , ref , documentPath , & resolved )
651
+ doc , componentPath , err := loader .resolveComponent (doc , ref , documentPath , & resolved )
663
652
if err != nil {
664
653
return err
665
654
}
666
655
if err := loader .resolveResponseRef (doc , & resolved , componentPath ); err != nil {
667
656
return err
668
657
}
669
658
component .Value = resolved .Value
670
- documentPath = loader . documentPathForRecursiveRef ( documentPath , resolved . Ref )
659
+ return nil
671
660
}
672
661
}
673
662
value := component .Value
@@ -742,19 +731,15 @@ func (loader *Loader) resolveSchemaRef(doc *T, component *SchemaRef, documentPat
742
731
visited = append (visited , ref )
743
732
744
733
var resolved SchemaRef
745
- componentPath , err := loader .resolveComponent (doc , ref , documentPath , & resolved )
734
+ doc , componentPath , err := loader .resolveComponent (doc , ref , documentPath , & resolved )
746
735
if err != nil {
747
736
return err
748
737
}
749
738
if err := loader .resolveSchemaRef (doc , & resolved , componentPath , visited ); err != nil {
750
739
return err
751
740
}
752
741
component .Value = resolved .Value
753
- foundPath , rerr := loader .getResolvedRefPath (ref , & resolved , documentPath , componentPath )
754
- if rerr != nil {
755
- return fmt .Errorf ("failed to resolve file from reference %q: %w" , ref , rerr )
756
- }
757
- documentPath = loader .documentPathForRecursiveRef (documentPath , foundPath )
742
+ return nil
758
743
}
759
744
if loader .visitedSchema == nil {
760
745
loader .visitedSchema = make (map [* Schema ]struct {})
@@ -805,30 +790,6 @@ func (loader *Loader) resolveSchemaRef(doc *T, component *SchemaRef, documentPat
805
790
return nil
806
791
}
807
792
808
- func (loader * Loader ) getResolvedRefPath (ref string , resolved * SchemaRef , cur , found * url.URL ) (string , error ) {
809
- if referencedFilename := strings .Split (ref , "#" )[0 ]; referencedFilename == "" {
810
- if cur != nil {
811
- if loader .rootDir != "" && strings .HasPrefix (cur .Path , loader .rootDir ) {
812
- return cur .Path [len (loader .rootDir )+ 1 :], nil
813
- }
814
-
815
- return path .Base (cur .Path ), nil
816
- }
817
- return "" , nil
818
- }
819
- // ref. to external file
820
- if resolved .Ref != "" {
821
- return resolved .Ref , nil
822
- }
823
-
824
- if loader .rootDir == "" {
825
- return found .Path , nil
826
- }
827
-
828
- // found dest spec. file
829
- return filepath .Rel (loader .rootDir , found .Path )
830
- }
831
-
832
793
func (loader * Loader ) resolveSecuritySchemeRef (doc * T , component * SecuritySchemeRef , documentPath * url.URL ) (err error ) {
833
794
if component != nil && component .Value != nil {
834
795
if loader .visitedSecurityScheme == nil {
@@ -852,15 +813,15 @@ func (loader *Loader) resolveSecuritySchemeRef(doc *T, component *SecurityScheme
852
813
component .Value = & scheme
853
814
} else {
854
815
var resolved SecuritySchemeRef
855
- componentPath , err := loader .resolveComponent (doc , ref , documentPath , & resolved )
816
+ doc , componentPath , err := loader .resolveComponent (doc , ref , documentPath , & resolved )
856
817
if err != nil {
857
818
return err
858
819
}
859
820
if err := loader .resolveSecuritySchemeRef (doc , & resolved , componentPath ); err != nil {
860
821
return err
861
822
}
862
823
component .Value = resolved .Value
863
- _ = loader . documentPathForRecursiveRef ( documentPath , resolved . Ref )
824
+ return nil
864
825
}
865
826
}
866
827
return nil
@@ -889,15 +850,15 @@ func (loader *Loader) resolveExampleRef(doc *T, component *ExampleRef, documentP
889
850
component .Value = & example
890
851
} else {
891
852
var resolved ExampleRef
892
- componentPath , err := loader .resolveComponent (doc , ref , documentPath , & resolved )
853
+ doc , componentPath , err := loader .resolveComponent (doc , ref , documentPath , & resolved )
893
854
if err != nil {
894
855
return err
895
856
}
896
857
if err := loader .resolveExampleRef (doc , & resolved , componentPath ); err != nil {
897
858
return err
898
859
}
899
860
component .Value = resolved .Value
900
- _ = loader . documentPathForRecursiveRef ( documentPath , resolved . Ref )
861
+ return nil
901
862
}
902
863
}
903
864
return nil
@@ -916,15 +877,15 @@ func (loader *Loader) resolveCallbackRef(doc *T, component *CallbackRef, documen
916
877
component .Value = & resolved
917
878
} else {
918
879
var resolved CallbackRef
919
- componentPath , err := loader .resolveComponent (doc , ref , documentPath , & resolved )
880
+ doc , componentPath , err := loader .resolveComponent (doc , ref , documentPath , & resolved )
920
881
if err != nil {
921
882
return err
922
883
}
923
884
if err := loader .resolveCallbackRef (doc , & resolved , componentPath ); err != nil {
924
885
return err
925
886
}
926
887
component .Value = resolved .Value
927
- documentPath = loader . documentPathForRecursiveRef ( documentPath , resolved . Ref )
888
+ return nil
928
889
}
929
890
}
930
891
value := component .Value
@@ -1014,15 +975,15 @@ func (loader *Loader) resolveLinkRef(doc *T, component *LinkRef, documentPath *u
1014
975
component .Value = & link
1015
976
} else {
1016
977
var resolved LinkRef
1017
- componentPath , err := loader .resolveComponent (doc , ref , documentPath , & resolved )
978
+ doc , componentPath , err := loader .resolveComponent (doc , ref , documentPath , & resolved )
1018
979
if err != nil {
1019
980
return err
1020
981
}
1021
982
if err := loader .resolveLinkRef (doc , & resolved , componentPath ); err != nil {
1022
983
return err
1023
984
}
1024
985
component .Value = resolved .Value
1025
- _ = loader . documentPathForRecursiveRef ( documentPath , resolved . Ref )
986
+ return nil
1026
987
}
1027
988
}
1028
989
return nil
0 commit comments