@@ -20,7 +20,13 @@ import (
20
20
"strings"
21
21
)
22
22
23
- // YieldOperation returns resolution back to jsonpointer's internal resolution.
23
+ // YieldOperation returns resolution back to jsonpointer. This error can be
24
+ // utilized within methods satisfying Resolver (ResolveJSONPointer), Assigner
25
+ // (AssignByJSONPointer), and Deleter (DeleteByJSONPointer) as an escape hatch.
26
+ //
27
+ // The intent is is that there may only be certain fields that your application
28
+ // would like to manually resolve. For the rest, you'd return YieldOperation as
29
+ // the error.
24
30
var YieldOperation = errors .New ("yield resolution to jsonpointer" )
25
31
26
32
var (
@@ -107,6 +113,14 @@ func (p JSONPointer) PrependString(token string) JSONPointer {
107
113
return p .Prepend (Token (encoder .Replace (token )))
108
114
}
109
115
116
+ // Validate performs validation on p. The following checks are performed:
117
+ //
118
+ // - p must be either empty or start with '/
119
+ //
120
+ // - p must be properly encoded, meaning that '~' must be immediately followed
121
+ // by a '0' or '1'.
122
+ //
123
+ //
110
124
func (p JSONPointer ) Validate () (err error ) {
111
125
if err = p .validateStart (); err != nil {
112
126
return err
@@ -118,8 +132,11 @@ func (p JSONPointer) validateeEncoding() error {
118
132
if len (p ) == 0 {
119
133
return nil
120
134
}
135
+ if p [len (p )- 1 ] == '~' {
136
+ return ErrMalformedEncoding
137
+ }
121
138
for i := len (p ) - 1 ; i >= 0 ; i -- {
122
- if p [i ] == '~' && (i == len ( p ) - 1 || ( p [i + 1 ] != '0' && p [i + 1 ] != '1' ) ) {
139
+ if p [i ] == '~' && (p [i + 1 ] != '0' && p [i + 1 ] != '1' ) {
123
140
return ErrMalformedEncoding
124
141
}
125
142
}
0 commit comments