// "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 }
func TestFragmentOnly(t *testing.T) { in := "#/fragment/only" r1, err := New(in) if err != nil { t.Errorf("New(%v) error %s", in, err.Error()) } if in != r1.String() { t.Errorf("New(%v) = %v, expect %v", in, r1.String(), in) } if r1.HasFragmentOnly != true { t.Errorf("New(%v)::HasFragmentOnly %v expect %v", in, r1.HasFragmentOnly, true) } if r1.HasFullURL != false { t.Errorf("New(%v)::HasFullURL %v expect %v", in, r1.HasFullURL, false) } if r1.HasURLPathOnly != false { t.Errorf("New(%v)::HasURLPathOnly %v expect %v", in, r1.HasURLPathOnly, false) } if r1.HasFileScheme != false { t.Errorf("New(%v)::HasFileScheme %v expect %v", in, r1.HasFileScheme, false) } if r1.GetPointer().String() != "/fragment/only" { t.Errorf("New(%v)::GetPointer() %v expect %v", in, r1.GetPointer().String(), "/fragment/only") } p, _ := jsonpointer.New(r1.referenceURL.Fragment) r2 := Ref{referencePointer: p, HasFragmentOnly: true} assert.Equal(t, r2.String(), in) r3 := Ref{referencePointer: p, HasFragmentOnly: false} assert.Equal(t, r3.String(), in[1:]) }
if err := resolver.Resolve(&ref, result); err != nil { return nil, err } return result, nil } type schemaLoader struct { loadingRef *Ref startingRef *Ref currentRef *Ref root interface{} cache ResolutionCache loadDoc DocLoader } 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)