...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 package jsonreference
27
28 import (
29 "errors"
30 "net/url"
31 "strings"
32
33 "github.com/go-openapi/jsonpointer"
34 "github.com/go-openapi/jsonreference/internal"
35 )
36
37 const (
38 fragmentRune = `#`
39 )
40
41
42 func New(jsonReferenceString string) (Ref, error) {
43
44 var r Ref
45 err := r.parse(jsonReferenceString)
46 return r, err
47
48 }
49
50
51
52 func MustCreateRef(ref string) Ref {
53 r, err := New(ref)
54 if err != nil {
55 panic(err)
56 }
57 return r
58 }
59
60
61 type Ref struct {
62 referenceURL *url.URL
63 referencePointer jsonpointer.Pointer
64
65 HasFullURL bool
66 HasURLPathOnly bool
67 HasFragmentOnly bool
68 HasFileScheme bool
69 HasFullFilePath bool
70 }
71
72
73 func (r *Ref) GetURL() *url.URL {
74 return r.referenceURL
75 }
76
77
78 func (r *Ref) GetPointer() *jsonpointer.Pointer {
79 return &r.referencePointer
80 }
81
82
83 func (r *Ref) String() string {
84
85 if r.referenceURL != nil {
86 return r.referenceURL.String()
87 }
88
89 if r.HasFragmentOnly {
90 return fragmentRune + r.referencePointer.String()
91 }
92
93 return r.referencePointer.String()
94 }
95
96
97 func (r *Ref) IsRoot() bool {
98 return r.referenceURL != nil &&
99 !r.IsCanonical() &&
100 !r.HasURLPathOnly &&
101 r.referenceURL.Fragment == ""
102 }
103
104
105 func (r *Ref) IsCanonical() bool {
106 return (r.HasFileScheme && r.HasFullFilePath) || (!r.HasFileScheme && r.HasFullURL)
107 }
108
109
110 func (r *Ref) parse(jsonReferenceString string) error {
111
112 parsed, err := url.Parse(jsonReferenceString)
113 if err != nil {
114 return err
115 }
116
117 internal.NormalizeURL(parsed)
118
119 r.referenceURL = parsed
120 refURL := r.referenceURL
121
122 if refURL.Scheme != "" && refURL.Host != "" {
123 r.HasFullURL = true
124 } else {
125 if refURL.Path != "" {
126 r.HasURLPathOnly = true
127 } else if refURL.RawQuery == "" && refURL.Fragment != "" {
128 r.HasFragmentOnly = true
129 }
130 }
131
132 r.HasFileScheme = refURL.Scheme == "file"
133 r.HasFullFilePath = strings.HasPrefix(refURL.Path, "/")
134
135
136 r.referencePointer, _ = jsonpointer.New(refURL.Fragment)
137
138 return nil
139 }
140
141
142
143 func (r *Ref) Inherits(child Ref) (*Ref, error) {
144 childURL := child.GetURL()
145 parentURL := r.GetURL()
146 if childURL == nil {
147 return nil, errors.New("child url is nil")
148 }
149 if parentURL == nil {
150 return &child, nil
151 }
152
153 ref, err := New(parentURL.ResolveReference(childURL).String())
154 if err != nil {
155 return nil, err
156 }
157 return &ref, nil
158 }
159
View as plain text