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
27
28
29 package proto
30
31 import (
32 "io"
33 "reflect"
34 )
35
36 func makeUnmarshalMessage(sub *unmarshalInfo, name string) unmarshaler {
37 return func(b []byte, f pointer, w int) ([]byte, error) {
38 if w != WireBytes {
39 return nil, errInternalBadWireType
40 }
41 x, n := decodeVarint(b)
42 if n == 0 {
43 return nil, io.ErrUnexpectedEOF
44 }
45 b = b[n:]
46 if x > uint64(len(b)) {
47 return nil, io.ErrUnexpectedEOF
48 }
49
50
51
52
53 v := f
54 if v.isNil() {
55 v = valToPointer(reflect.New(sub.typ))
56 f.setPointer(v)
57 }
58 err := sub.unmarshal(v, b[:x])
59 if err != nil {
60 if r, ok := err.(*RequiredNotSetError); ok {
61 r.field = name + "." + r.field
62 } else {
63 return nil, err
64 }
65 }
66 return b[x:], err
67 }
68 }
69
70 func makeUnmarshalMessageSlice(sub *unmarshalInfo, name string) unmarshaler {
71 return func(b []byte, f pointer, w int) ([]byte, error) {
72 if w != WireBytes {
73 return nil, errInternalBadWireType
74 }
75 x, n := decodeVarint(b)
76 if n == 0 {
77 return nil, io.ErrUnexpectedEOF
78 }
79 b = b[n:]
80 if x > uint64(len(b)) {
81 return nil, io.ErrUnexpectedEOF
82 }
83 v := valToPointer(reflect.New(sub.typ))
84 err := sub.unmarshal(v, b[:x])
85 if err != nil {
86 if r, ok := err.(*RequiredNotSetError); ok {
87 r.field = name + "." + r.field
88 } else {
89 return nil, err
90 }
91 }
92 f.appendRef(v, sub.typ)
93 return b[x:], err
94 }
95 }
96
97 func makeUnmarshalCustomPtr(sub *unmarshalInfo, name string) unmarshaler {
98 return func(b []byte, f pointer, w int) ([]byte, error) {
99 if w != WireBytes {
100 return nil, errInternalBadWireType
101 }
102 x, n := decodeVarint(b)
103 if n == 0 {
104 return nil, io.ErrUnexpectedEOF
105 }
106 b = b[n:]
107 if x > uint64(len(b)) {
108 return nil, io.ErrUnexpectedEOF
109 }
110
111 s := f.asPointerTo(reflect.PtrTo(sub.typ)).Elem()
112 s.Set(reflect.New(sub.typ))
113 m := s.Interface().(custom)
114 if err := m.Unmarshal(b[:x]); err != nil {
115 return nil, err
116 }
117 return b[x:], nil
118 }
119 }
120
121 func makeUnmarshalCustomSlice(sub *unmarshalInfo, name string) unmarshaler {
122 return func(b []byte, f pointer, w int) ([]byte, error) {
123 if w != WireBytes {
124 return nil, errInternalBadWireType
125 }
126 x, n := decodeVarint(b)
127 if n == 0 {
128 return nil, io.ErrUnexpectedEOF
129 }
130 b = b[n:]
131 if x > uint64(len(b)) {
132 return nil, io.ErrUnexpectedEOF
133 }
134 m := reflect.New(sub.typ)
135 c := m.Interface().(custom)
136 if err := c.Unmarshal(b[:x]); err != nil {
137 return nil, err
138 }
139 v := valToPointer(m)
140 f.appendRef(v, sub.typ)
141 return b[x:], nil
142 }
143 }
144
145 func makeUnmarshalCustom(sub *unmarshalInfo, name string) unmarshaler {
146 return func(b []byte, f pointer, w int) ([]byte, error) {
147 if w != WireBytes {
148 return nil, errInternalBadWireType
149 }
150 x, n := decodeVarint(b)
151 if n == 0 {
152 return nil, io.ErrUnexpectedEOF
153 }
154 b = b[n:]
155 if x > uint64(len(b)) {
156 return nil, io.ErrUnexpectedEOF
157 }
158
159 m := f.asPointerTo(sub.typ).Interface().(custom)
160 if err := m.Unmarshal(b[:x]); err != nil {
161 return nil, err
162 }
163 return b[x:], nil
164 }
165 }
166
167 func makeUnmarshalTime(sub *unmarshalInfo, name string) unmarshaler {
168 return func(b []byte, f pointer, w int) ([]byte, error) {
169 if w != WireBytes {
170 return nil, errInternalBadWireType
171 }
172 x, n := decodeVarint(b)
173 if n == 0 {
174 return nil, io.ErrUnexpectedEOF
175 }
176 b = b[n:]
177 if x > uint64(len(b)) {
178 return nil, io.ErrUnexpectedEOF
179 }
180 m := ×tamp{}
181 if err := Unmarshal(b[:x], m); err != nil {
182 return nil, err
183 }
184 t, err := timestampFromProto(m)
185 if err != nil {
186 return nil, err
187 }
188 s := f.asPointerTo(sub.typ).Elem()
189 s.Set(reflect.ValueOf(t))
190 return b[x:], nil
191 }
192 }
193
194 func makeUnmarshalTimePtr(sub *unmarshalInfo, name string) unmarshaler {
195 return func(b []byte, f pointer, w int) ([]byte, error) {
196 if w != WireBytes {
197 return nil, errInternalBadWireType
198 }
199 x, n := decodeVarint(b)
200 if n == 0 {
201 return nil, io.ErrUnexpectedEOF
202 }
203 b = b[n:]
204 if x > uint64(len(b)) {
205 return nil, io.ErrUnexpectedEOF
206 }
207 m := ×tamp{}
208 if err := Unmarshal(b[:x], m); err != nil {
209 return nil, err
210 }
211 t, err := timestampFromProto(m)
212 if err != nil {
213 return nil, err
214 }
215 s := f.asPointerTo(reflect.PtrTo(sub.typ)).Elem()
216 s.Set(reflect.ValueOf(&t))
217 return b[x:], nil
218 }
219 }
220
221 func makeUnmarshalTimePtrSlice(sub *unmarshalInfo, name string) unmarshaler {
222 return func(b []byte, f pointer, w int) ([]byte, error) {
223 if w != WireBytes {
224 return nil, errInternalBadWireType
225 }
226 x, n := decodeVarint(b)
227 if n == 0 {
228 return nil, io.ErrUnexpectedEOF
229 }
230 b = b[n:]
231 if x > uint64(len(b)) {
232 return nil, io.ErrUnexpectedEOF
233 }
234 m := ×tamp{}
235 if err := Unmarshal(b[:x], m); err != nil {
236 return nil, err
237 }
238 t, err := timestampFromProto(m)
239 if err != nil {
240 return nil, err
241 }
242 slice := f.getSlice(reflect.PtrTo(sub.typ))
243 newSlice := reflect.Append(slice, reflect.ValueOf(&t))
244 slice.Set(newSlice)
245 return b[x:], nil
246 }
247 }
248
249 func makeUnmarshalTimeSlice(sub *unmarshalInfo, name string) unmarshaler {
250 return func(b []byte, f pointer, w int) ([]byte, error) {
251 if w != WireBytes {
252 return nil, errInternalBadWireType
253 }
254 x, n := decodeVarint(b)
255 if n == 0 {
256 return nil, io.ErrUnexpectedEOF
257 }
258 b = b[n:]
259 if x > uint64(len(b)) {
260 return nil, io.ErrUnexpectedEOF
261 }
262 m := ×tamp{}
263 if err := Unmarshal(b[:x], m); err != nil {
264 return nil, err
265 }
266 t, err := timestampFromProto(m)
267 if err != nil {
268 return nil, err
269 }
270 slice := f.getSlice(sub.typ)
271 newSlice := reflect.Append(slice, reflect.ValueOf(t))
272 slice.Set(newSlice)
273 return b[x:], nil
274 }
275 }
276
277 func makeUnmarshalDurationPtr(sub *unmarshalInfo, name string) unmarshaler {
278 return func(b []byte, f pointer, w int) ([]byte, error) {
279 if w != WireBytes {
280 return nil, errInternalBadWireType
281 }
282 x, n := decodeVarint(b)
283 if n == 0 {
284 return nil, io.ErrUnexpectedEOF
285 }
286 b = b[n:]
287 if x > uint64(len(b)) {
288 return nil, io.ErrUnexpectedEOF
289 }
290 m := &duration{}
291 if err := Unmarshal(b[:x], m); err != nil {
292 return nil, err
293 }
294 d, err := durationFromProto(m)
295 if err != nil {
296 return nil, err
297 }
298 s := f.asPointerTo(reflect.PtrTo(sub.typ)).Elem()
299 s.Set(reflect.ValueOf(&d))
300 return b[x:], nil
301 }
302 }
303
304 func makeUnmarshalDuration(sub *unmarshalInfo, name string) unmarshaler {
305 return func(b []byte, f pointer, w int) ([]byte, error) {
306 if w != WireBytes {
307 return nil, errInternalBadWireType
308 }
309 x, n := decodeVarint(b)
310 if n == 0 {
311 return nil, io.ErrUnexpectedEOF
312 }
313 b = b[n:]
314 if x > uint64(len(b)) {
315 return nil, io.ErrUnexpectedEOF
316 }
317 m := &duration{}
318 if err := Unmarshal(b[:x], m); err != nil {
319 return nil, err
320 }
321 d, err := durationFromProto(m)
322 if err != nil {
323 return nil, err
324 }
325 s := f.asPointerTo(sub.typ).Elem()
326 s.Set(reflect.ValueOf(d))
327 return b[x:], nil
328 }
329 }
330
331 func makeUnmarshalDurationPtrSlice(sub *unmarshalInfo, name string) unmarshaler {
332 return func(b []byte, f pointer, w int) ([]byte, error) {
333 if w != WireBytes {
334 return nil, errInternalBadWireType
335 }
336 x, n := decodeVarint(b)
337 if n == 0 {
338 return nil, io.ErrUnexpectedEOF
339 }
340 b = b[n:]
341 if x > uint64(len(b)) {
342 return nil, io.ErrUnexpectedEOF
343 }
344 m := &duration{}
345 if err := Unmarshal(b[:x], m); err != nil {
346 return nil, err
347 }
348 d, err := durationFromProto(m)
349 if err != nil {
350 return nil, err
351 }
352 slice := f.getSlice(reflect.PtrTo(sub.typ))
353 newSlice := reflect.Append(slice, reflect.ValueOf(&d))
354 slice.Set(newSlice)
355 return b[x:], nil
356 }
357 }
358
359 func makeUnmarshalDurationSlice(sub *unmarshalInfo, name string) unmarshaler {
360 return func(b []byte, f pointer, w int) ([]byte, error) {
361 if w != WireBytes {
362 return nil, errInternalBadWireType
363 }
364 x, n := decodeVarint(b)
365 if n == 0 {
366 return nil, io.ErrUnexpectedEOF
367 }
368 b = b[n:]
369 if x > uint64(len(b)) {
370 return nil, io.ErrUnexpectedEOF
371 }
372 m := &duration{}
373 if err := Unmarshal(b[:x], m); err != nil {
374 return nil, err
375 }
376 d, err := durationFromProto(m)
377 if err != nil {
378 return nil, err
379 }
380 slice := f.getSlice(sub.typ)
381 newSlice := reflect.Append(slice, reflect.ValueOf(d))
382 slice.Set(newSlice)
383 return b[x:], nil
384 }
385 }
386
View as plain text