func (r *schemaLoader) resolveRef(currentRef, ref *Ref, node, target interface{}) error { tgt := reflect.ValueOf(target) if tgt.Kind() != reflect.Ptr { return fmt.Errorf("resolve ref: target needs to be a pointer") } oldRef := currentRef if currentRef != nil { var err error currentRef, err = currentRef.Inherits(*nextRef(node, ref, currentRef.GetPointer())) if err != nil { return err } } if currentRef == nil { currentRef = ref } refURL := currentRef.GetURL() if refURL == nil { return nil } if currentRef.IsRoot() { nv := reflect.ValueOf(node) reflect.Indirect(tgt).Set(reflect.Indirect(nv)) return nil } if strings.HasPrefix(refURL.String(), "#") { res, _, err := ref.GetPointer().Get(node) if err != nil { res, _, err = ref.GetPointer().Get(r.root) if err != nil { return err } } rv := reflect.Indirect(reflect.ValueOf(res)) tgtType := reflect.Indirect(tgt).Type() if rv.Type().AssignableTo(tgtType) { reflect.Indirect(tgt).Set(reflect.Indirect(reflect.ValueOf(res))) } else { if err := swag.DynamicJSONToStruct(rv.Interface(), target); err != nil { return err } } return nil } if refURL.Scheme != "" && refURL.Host != "" { // most definitely take the red pill data, _, _, err := r.load(refURL) if err != nil { return err } if ((oldRef == nil && currentRef != nil) || (oldRef != nil && currentRef == nil) || oldRef.String() != currentRef.String()) && ((oldRef == nil && ref != nil) || (oldRef != nil && ref == nil) || (oldRef.String() != ref.String())) { return r.resolveRef(currentRef, ref, data, target) } var res interface{} if currentRef.String() != "" { res, _, err = currentRef.GetPointer().Get(data) if err != nil { return err } } else { res = data } if err := swag.DynamicJSONToStruct(res, target); err != nil { return err } } return nil }
func (r *schemaLoader) resolveRef(currentRef, ref *Ref, node, target interface{}) error { tgt := reflect.ValueOf(target) if tgt.Kind() != reflect.Ptr { return fmt.Errorf("resolve ref: target needs to be a pointer") } oldRef := currentRef if currentRef != nil { debugLog("resolve ref current %s new %s", currentRef.String(), ref.String()) nextRef := nextRef(node, ref, currentRef.GetPointer()) if nextRef == nil || nextRef.GetURL() == nil { return nil } var err error currentRef, err = currentRef.Inherits(*nextRef) debugLog("resolved ref current %s", currentRef.String()) if err != nil { return err } } if currentRef == nil { currentRef = ref } refURL := currentRef.GetURL() if refURL == nil { return nil } if currentRef.IsRoot() { nv := reflect.ValueOf(node) reflect.Indirect(tgt).Set(reflect.Indirect(nv)) return nil } if strings.HasPrefix(refURL.String(), "#") { res, _, err := ref.GetPointer().Get(node) if err != nil { res, _, err = ref.GetPointer().Get(r.root) if err != nil { return err } } rv := reflect.Indirect(reflect.ValueOf(res)) tgtType := reflect.Indirect(tgt).Type() if rv.Type().AssignableTo(tgtType) { reflect.Indirect(tgt).Set(reflect.Indirect(reflect.ValueOf(res))) } else { if err := swag.DynamicJSONToStruct(rv.Interface(), target); err != nil { return err } } return nil } relativeBase := "" if r.options != nil && r.options.RelativeBase != "" { relativeBase = r.options.RelativeBase } normalizeFileRef(currentRef, relativeBase) debugLog("current ref normalized file: %s", currentRef.String()) normalizeFileRef(ref, relativeBase) debugLog("ref normalized file: %s", currentRef.String()) data, _, _, err := r.load(currentRef.GetURL()) if err != nil { panic(err) return err } if ((oldRef == nil && currentRef != nil) || (oldRef != nil && currentRef == nil) || oldRef.String() != currentRef.String()) && ((oldRef == nil && ref != nil) || (oldRef != nil && ref == nil) || (oldRef.String() != ref.String())) { return r.resolveRef(currentRef, ref, data, target) } var res interface{} if currentRef.String() != "" { res, _, err = currentRef.GetPointer().Get(data) if err != nil { if strings.HasPrefix(ref.String(), "#") { if r.loadingRef != nil { rr, er := r.loadingRef.Inherits(*ref) if er != nil { return er } refURL = rr.GetURL() data, _, _, err = r.load(refURL) if err != nil { panic(err) return err } } else { data = r.root } } res, _, err = ref.GetPointer().Get(data) if err != nil { return err } } } else { res = data } if err := swag.DynamicJSONToStruct(res, target); err != nil { return err } r.currentRef = currentRef return nil }