annotate vendor/gopkg.in/yaml.v3/resolve.go @ 82:1b27391363d1 draft

Add posthook examples Signed-off-by: Izuru Yakumo <yakumo.izuru@chaotic.ninja>
author yakumo.izuru
date Tue, 26 Mar 2024 02:14:25 +0000
parents d8727551f403
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
74
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2 // Copyright (c) 2011-2019 Canonical Ltd
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
3 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
4 // Licensed under the Apache License, Version 2.0 (the "License");
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
5 // you may not use this file except in compliance with the License.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
6 // You may obtain a copy of the License at
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
7 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
8 // http://www.apache.org/licenses/LICENSE-2.0
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
9 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
10 // Unless required by applicable law or agreed to in writing, software
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
11 // distributed under the License is distributed on an "AS IS" BASIS,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
13 // See the License for the specific language governing permissions and
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
14 // limitations under the License.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
15
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
16 package yaml
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
17
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
18 import (
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
19 "encoding/base64"
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
20 "math"
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
21 "regexp"
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
22 "strconv"
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
23 "strings"
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
24 "time"
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
25 )
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
26
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
27 type resolveMapItem struct {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
28 value interface{}
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
29 tag string
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
30 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
31
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
32 var resolveTable = make([]byte, 256)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
33 var resolveMap = make(map[string]resolveMapItem)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
34
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
35 func init() {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
36 t := resolveTable
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
37 t[int('+')] = 'S' // Sign
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
38 t[int('-')] = 'S'
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
39 for _, c := range "0123456789" {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
40 t[int(c)] = 'D' // Digit
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
41 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
42 for _, c := range "yYnNtTfFoO~" {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
43 t[int(c)] = 'M' // In map
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
44 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
45 t[int('.')] = '.' // Float (potentially in map)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
46
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
47 var resolveMapList = []struct {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
48 v interface{}
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
49 tag string
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
50 l []string
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
51 }{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
52 {true, boolTag, []string{"true", "True", "TRUE"}},
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
53 {false, boolTag, []string{"false", "False", "FALSE"}},
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
54 {nil, nullTag, []string{"", "~", "null", "Null", "NULL"}},
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
55 {math.NaN(), floatTag, []string{".nan", ".NaN", ".NAN"}},
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
56 {math.Inf(+1), floatTag, []string{".inf", ".Inf", ".INF"}},
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
57 {math.Inf(+1), floatTag, []string{"+.inf", "+.Inf", "+.INF"}},
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
58 {math.Inf(-1), floatTag, []string{"-.inf", "-.Inf", "-.INF"}},
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
59 {"<<", mergeTag, []string{"<<"}},
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
60 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
61
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
62 m := resolveMap
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
63 for _, item := range resolveMapList {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
64 for _, s := range item.l {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
65 m[s] = resolveMapItem{item.v, item.tag}
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
66 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
67 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
68 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
69
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
70 const (
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
71 nullTag = "!!null"
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
72 boolTag = "!!bool"
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
73 strTag = "!!str"
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
74 intTag = "!!int"
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
75 floatTag = "!!float"
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
76 timestampTag = "!!timestamp"
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
77 seqTag = "!!seq"
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
78 mapTag = "!!map"
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
79 binaryTag = "!!binary"
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
80 mergeTag = "!!merge"
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
81 )
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
82
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
83 var longTags = make(map[string]string)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
84 var shortTags = make(map[string]string)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
85
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
86 func init() {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
87 for _, stag := range []string{nullTag, boolTag, strTag, intTag, floatTag, timestampTag, seqTag, mapTag, binaryTag, mergeTag} {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
88 ltag := longTag(stag)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
89 longTags[stag] = ltag
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
90 shortTags[ltag] = stag
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
91 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
92 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
93
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
94 const longTagPrefix = "tag:yaml.org,2002:"
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
95
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
96 func shortTag(tag string) string {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
97 if strings.HasPrefix(tag, longTagPrefix) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
98 if stag, ok := shortTags[tag]; ok {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
99 return stag
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
100 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
101 return "!!" + tag[len(longTagPrefix):]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
102 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
103 return tag
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
104 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
105
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
106 func longTag(tag string) string {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
107 if strings.HasPrefix(tag, "!!") {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
108 if ltag, ok := longTags[tag]; ok {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
109 return ltag
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
110 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
111 return longTagPrefix + tag[2:]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
112 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
113 return tag
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
114 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
115
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
116 func resolvableTag(tag string) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
117 switch tag {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
118 case "", strTag, boolTag, intTag, floatTag, nullTag, timestampTag:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
119 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
120 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
121 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
122 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
123
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
124 var yamlStyleFloat = regexp.MustCompile(`^[-+]?(\.[0-9]+|[0-9]+(\.[0-9]*)?)([eE][-+]?[0-9]+)?$`)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
125
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
126 func resolve(tag string, in string) (rtag string, out interface{}) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
127 tag = shortTag(tag)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
128 if !resolvableTag(tag) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
129 return tag, in
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
130 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
131
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
132 defer func() {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
133 switch tag {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
134 case "", rtag, strTag, binaryTag:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
135 return
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
136 case floatTag:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
137 if rtag == intTag {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
138 switch v := out.(type) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
139 case int64:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
140 rtag = floatTag
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
141 out = float64(v)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
142 return
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
143 case int:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
144 rtag = floatTag
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
145 out = float64(v)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
146 return
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
147 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
148 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
149 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
150 failf("cannot decode %s `%s` as a %s", shortTag(rtag), in, shortTag(tag))
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
151 }()
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
152
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
153 // Any data is accepted as a !!str or !!binary.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
154 // Otherwise, the prefix is enough of a hint about what it might be.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
155 hint := byte('N')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
156 if in != "" {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
157 hint = resolveTable[in[0]]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
158 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
159 if hint != 0 && tag != strTag && tag != binaryTag {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
160 // Handle things we can lookup in a map.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
161 if item, ok := resolveMap[in]; ok {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
162 return item.tag, item.value
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
163 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
164
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
165 // Base 60 floats are a bad idea, were dropped in YAML 1.2, and
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
166 // are purposefully unsupported here. They're still quoted on
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
167 // the way out for compatibility with other parser, though.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
168
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
169 switch hint {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
170 case 'M':
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
171 // We've already checked the map above.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
172
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
173 case '.':
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
174 // Not in the map, so maybe a normal float.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
175 floatv, err := strconv.ParseFloat(in, 64)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
176 if err == nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
177 return floatTag, floatv
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
178 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
179
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
180 case 'D', 'S':
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
181 // Int, float, or timestamp.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
182 // Only try values as a timestamp if the value is unquoted or there's an explicit
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
183 // !!timestamp tag.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
184 if tag == "" || tag == timestampTag {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
185 t, ok := parseTimestamp(in)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
186 if ok {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
187 return timestampTag, t
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
188 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
189 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
190
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
191 plain := strings.Replace(in, "_", "", -1)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
192 intv, err := strconv.ParseInt(plain, 0, 64)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
193 if err == nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
194 if intv == int64(int(intv)) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
195 return intTag, int(intv)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
196 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
197 return intTag, intv
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
198 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
199 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
200 uintv, err := strconv.ParseUint(plain, 0, 64)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
201 if err == nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
202 return intTag, uintv
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
203 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
204 if yamlStyleFloat.MatchString(plain) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
205 floatv, err := strconv.ParseFloat(plain, 64)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
206 if err == nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
207 return floatTag, floatv
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
208 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
209 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
210 if strings.HasPrefix(plain, "0b") {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
211 intv, err := strconv.ParseInt(plain[2:], 2, 64)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
212 if err == nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
213 if intv == int64(int(intv)) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
214 return intTag, int(intv)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
215 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
216 return intTag, intv
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
217 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
218 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
219 uintv, err := strconv.ParseUint(plain[2:], 2, 64)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
220 if err == nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
221 return intTag, uintv
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
222 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
223 } else if strings.HasPrefix(plain, "-0b") {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
224 intv, err := strconv.ParseInt("-"+plain[3:], 2, 64)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
225 if err == nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
226 if true || intv == int64(int(intv)) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
227 return intTag, int(intv)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
228 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
229 return intTag, intv
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
230 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
231 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
232 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
233 // Octals as introduced in version 1.2 of the spec.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
234 // Octals from the 1.1 spec, spelled as 0777, are still
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
235 // decoded by default in v3 as well for compatibility.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
236 // May be dropped in v4 depending on how usage evolves.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
237 if strings.HasPrefix(plain, "0o") {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
238 intv, err := strconv.ParseInt(plain[2:], 8, 64)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
239 if err == nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
240 if intv == int64(int(intv)) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
241 return intTag, int(intv)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
242 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
243 return intTag, intv
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
244 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
245 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
246 uintv, err := strconv.ParseUint(plain[2:], 8, 64)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
247 if err == nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
248 return intTag, uintv
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
249 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
250 } else if strings.HasPrefix(plain, "-0o") {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
251 intv, err := strconv.ParseInt("-"+plain[3:], 8, 64)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
252 if err == nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
253 if true || intv == int64(int(intv)) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
254 return intTag, int(intv)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
255 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
256 return intTag, intv
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
257 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
258 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
259 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
260 default:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
261 panic("internal error: missing handler for resolver table: " + string(rune(hint)) + " (with " + in + ")")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
262 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
263 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
264 return strTag, in
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
265 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
266
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
267 // encodeBase64 encodes s as base64 that is broken up into multiple lines
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
268 // as appropriate for the resulting length.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
269 func encodeBase64(s string) string {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
270 const lineLen = 70
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
271 encLen := base64.StdEncoding.EncodedLen(len(s))
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
272 lines := encLen/lineLen + 1
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
273 buf := make([]byte, encLen*2+lines)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
274 in := buf[0:encLen]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
275 out := buf[encLen:]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
276 base64.StdEncoding.Encode(in, []byte(s))
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
277 k := 0
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
278 for i := 0; i < len(in); i += lineLen {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
279 j := i + lineLen
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
280 if j > len(in) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
281 j = len(in)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
282 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
283 k += copy(out[k:], in[i:j])
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
284 if lines > 1 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
285 out[k] = '\n'
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
286 k++
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
287 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
288 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
289 return string(out[:k])
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
290 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
291
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
292 // This is a subset of the formats allowed by the regular expression
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
293 // defined at http://yaml.org/type/timestamp.html.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
294 var allowedTimestampFormats = []string{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
295 "2006-1-2T15:4:5.999999999Z07:00", // RCF3339Nano with short date fields.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
296 "2006-1-2t15:4:5.999999999Z07:00", // RFC3339Nano with short date fields and lower-case "t".
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
297 "2006-1-2 15:4:5.999999999", // space separated with no time zone
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
298 "2006-1-2", // date only
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
299 // Notable exception: time.Parse cannot handle: "2001-12-14 21:59:43.10 -5"
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
300 // from the set of examples.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
301 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
302
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
303 // parseTimestamp parses s as a timestamp string and
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
304 // returns the timestamp and reports whether it succeeded.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
305 // Timestamp formats are defined at http://yaml.org/type/timestamp.html
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
306 func parseTimestamp(s string) (time.Time, bool) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
307 // TODO write code to check all the formats supported by
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
308 // http://yaml.org/type/timestamp.html instead of using time.Parse.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
309
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
310 // Quick check: all date formats start with YYYY-.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
311 i := 0
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
312 for ; i < len(s); i++ {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
313 if c := s[i]; c < '0' || c > '9' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
314 break
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
315 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
316 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
317 if i != 4 || i == len(s) || s[i] != '-' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
318 return time.Time{}, false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
319 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
320 for _, format := range allowedTimestampFormats {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
321 if t, err := time.Parse(format, s); err == nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
322 return t, true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
323 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
324 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
325 return time.Time{}, false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
326 }