github.com/gogo/protobuf@v1.3.2/proto/table_unmarshal_gogo.go (about) 1 // Protocol Buffers for Go with Gadgets 2 // 3 // Copyright (c) 2018, The GoGo Authors. All rights reserved. 4 // http://github.com/gogo/protobuf 5 // 6 // Redistribution and use in source and binary forms, with or without 7 // modification, are permitted provided that the following conditions are 8 // met: 9 // 10 // * Redistributions of source code must retain the above copyright 11 // notice, this list of conditions and the following disclaimer. 12 // * Redistributions in binary form must reproduce the above 13 // copyright notice, this list of conditions and the following disclaimer 14 // in the documentation and/or other materials provided with the 15 // distribution. 16 // 17 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 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 // First read the message field to see if something is there. 50 // The semantics of multiple submessages are weird. Instead of 51 // the last one winning (as it is for all other fields), multiple 52 // submessages are merged. 53 v := f // gogo: changed from v := f.getPointer() 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) // gogo: changed from f.appendPointer(v) 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 }