// "Constructor", parses the given string JSON reference func (r *Ref) parse(jsonReferenceString string) error { parsed, err := url.Parse(jsonReferenceString) if err != nil { return err } r.ReferenceURL, _ = url.Parse(purell.NormalizeURL(parsed, purell.FlagsSafe|purell.FlagRemoveDuplicateSlashes)) refURL := r.ReferenceURL if refURL.Scheme != "" && refURL.Host != "" { r.HasFullURL = true } else { if refURL.Path != "" { r.HasURLPathOnly = true } else if refURL.RawQuery == "" && refURL.Fragment != "" { r.HasFragmentOnly = true } } r.HasFileScheme = refURL.Scheme == "file" r.HasFullFilePath = strings.HasPrefix(refURL.Path, "/") // invalid json-pointer error means url has no json-pointer fragment. simply ignore error r.referencePointer, _ = jsonpointer.New(refURL.Fragment) return nil }
return nil, err } return result, nil } type schemaLoader struct { loadingRef *Ref startingRef *Ref currentRef *Ref root interface{} cache ResolutionCache loadDoc DocLoader schemaRef *Ref } var idPtr, _ = jsonpointer.New("/id") var schemaPtr, _ = jsonpointer.New("/$schema") var refPtr, _ = jsonpointer.New("/$ref") func defaultSchemaLoader(root interface{}, ref *Ref, cache ResolutionCache) (*schemaLoader, error) { if cache == nil { cache = defaultResolutionCache() } var ptr *jsonpointer.Pointer if ref != nil { ptr = ref.GetPointer() } currentRef := nextRef(root, ref, ptr)