@@ -14,10 +14,6 @@ type PathResolver interface {
1414 Resolve (token string ) (interface {}, error )
1515}
1616
17- type AnchorResolver interface {
18- ResolveAnchor (anchor string , resolve func (anchor string , v interface {}) (interface {}, error )) (interface {}, error )
19- }
20-
2117type Converter interface {
2218 ConvertTo (i interface {}) (interface {}, error )
2319}
@@ -26,7 +22,7 @@ func Resolve(ref string, element interface{}, config *Config, reader Reader) err
2622 var err error
2723
2824 if strings .HasPrefix (ref , "#" ) {
29- err = resolveFragment (ref [1 :], config . Data , element )
25+ err = resolveFragment (ref [1 :], config , element )
3026 } else {
3127 var u * url.URL
3228 u , err = resolveUrl (ref , config )
@@ -47,7 +43,7 @@ func Resolve(ref string, element interface{}, config *Config, reader Reader) err
4743 if err != nil {
4844 return fmt .Errorf ("resolve reference '%v' failed: %w" , ref , err )
4945 }
50- err = resolveFragment (u .Fragment , sub . Data , element )
46+ err = resolveFragment (u .Fragment , sub , element )
5147 AddRef (config , sub )
5248 }
5349
@@ -57,13 +53,14 @@ func Resolve(ref string, element interface{}, config *Config, reader Reader) err
5753 return nil
5854}
5955
60- func resolveFragment (fragment string , val interface {}, resolved interface {}) (err error ) {
56+ func resolveFragment (fragment string , config * Config , resolved interface {}) (err error ) {
57+ val := config .Data
6158 if fragment == "" {
6259 // resolve to current (root) element
6360 } else if strings .HasPrefix (fragment , "/" ) {
64- val , err = resolvePath (fragment , val )
61+ val , err = resolvePath (fragment , config . Data )
6562 } else {
66- val , err = resolveAnchor (fragment , val )
63+ val , err = config . Scope . Get (fragment )
6764 }
6865 if err != nil {
6966 return fmt .Errorf ("resolve fragment '%v' failed: %w" , fragment , err )
@@ -204,50 +201,6 @@ func resolvePath(path string, v interface{}) (interface{}, error) {
204201 return cursor , nil
205202}
206203
207- func resolveAnchor (anchor string , v interface {}) (interface {}, error ) {
208- if r , ok := v .(AnchorResolver ); ok {
209- return r .ResolveAnchor (anchor , resolveAnchor )
210- }
211-
212- val := reflect .Indirect (reflect .ValueOf (v ))
213- switch val .Kind () {
214- case reflect .Struct :
215- for i := 0 ; i < val .NumField (); i ++ {
216- f := val .Field (i )
217- if ! f .CanInterface () {
218- continue
219- }
220-
221- json := val .Type ().Field (i ).Tag .Get ("json" )
222- if strings .Split (json , "," )[0 ] == "$anchor" {
223- if f .Interface () == anchor {
224- return v , nil
225- }
226- }
227-
228- if r , err := resolveAnchor (anchor , f .Interface ()); err == nil {
229- return r , nil
230- }
231- }
232- case reflect .Map :
233- if a := val .MapIndex (reflect .ValueOf ("$anchor" )); a .IsValid () {
234- if a .Interface () == anchor {
235- return v , nil
236- }
237- }
238-
239- for _ , k := range val .MapKeys () {
240- if r , err := resolveAnchor (anchor , val .MapIndex (k ).Interface ()); err == nil {
241- return r , nil
242- }
243- }
244- default :
245- return nil , fmt .Errorf ("type '%v' not supported for anchor search" , val .Kind ())
246- }
247-
248- return nil , fmt .Errorf ("anchor '%v' not found" , anchor )
249- }
250-
251204func resolveUrl (ref string , cfg * Config ) (* url.URL , error ) {
252205 u , err := url .Parse (ref )
253206 if err != nil {
0 commit comments