github.com/asifdxtreme/cli@v6.1.3-0.20150123051144-9ead8700b4ae+incompatible/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/proto/encode.go (about) 1 // Go support for Protocol Buffers - Google's data interchange format 2 // 3 // Copyright 2010 The Go Authors. All rights reserved. 4 // http://code.google.com/p/goprotobuf/ 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 // * Neither the name of Google Inc. nor the names of its 17 // contributors may be used to endorse or promote products derived from 18 // this software without specific prior written permission. 19 // 20 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 23 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 24 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 25 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 26 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 30 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 32 package proto 33 34 /* 35 * Routines for encoding data into the wire format for protocol buffers. 36 */ 37 38 import ( 39 "errors" 40 "fmt" 41 "reflect" 42 "sort" 43 ) 44 45 // RequiredNotSetError is the error returned if Marshal is called with 46 // a protocol buffer struct whose required fields have not 47 // all been initialized. It is also the error returned if Unmarshal is 48 // called with an encoded protocol buffer that does not include all the 49 // required fields. 50 // 51 // When printed, RequiredNotSetError reports the first unset required field in a 52 // message. If the field cannot be precisely determined, it is reported as 53 // "{Unknown}". 54 type RequiredNotSetError struct { 55 field string 56 } 57 58 func (e *RequiredNotSetError) Error() string { 59 return fmt.Sprintf("proto: required field %q not set", e.field) 60 } 61 62 var ( 63 // ErrRepeatedHasNil is the error returned if Marshal is called with 64 // a struct with a repeated field containing a nil element. 65 ErrRepeatedHasNil = errors.New("proto: repeated field has nil element") 66 67 // ErrNil is the error returned if Marshal is called with nil. 68 ErrNil = errors.New("proto: Marshal called with nil") 69 ) 70 71 // The fundamental encoders that put bytes on the wire. 72 // Those that take integer types all accept uint64 and are 73 // therefore of type valueEncoder. 74 75 const maxVarintBytes = 10 // maximum length of a varint 76 77 // EncodeVarint returns the varint encoding of x. 78 // This is the format for the 79 // int32, int64, uint32, uint64, bool, and enum 80 // protocol buffer types. 81 // Not used by the package itself, but helpful to clients 82 // wishing to use the same encoding. 83 func EncodeVarint(x uint64) []byte { 84 var buf [maxVarintBytes]byte 85 var n int 86 for n = 0; x > 127; n++ { 87 buf[n] = 0x80 | uint8(x&0x7F) 88 x >>= 7 89 } 90 buf[n] = uint8(x) 91 n++ 92 return buf[0:n] 93 } 94 95 // EncodeVarint writes a varint-encoded integer to the Buffer. 96 // This is the format for the 97 // int32, int64, uint32, uint64, bool, and enum 98 // protocol buffer types. 99 func (p *Buffer) EncodeVarint(x uint64) error { 100 for x >= 1<<7 { 101 p.buf = append(p.buf, uint8(x&0x7f|0x80)) 102 x >>= 7 103 } 104 p.buf = append(p.buf, uint8(x)) 105 return nil 106 } 107 108 func sizeVarint(x uint64) (n int) { 109 for { 110 n++ 111 x >>= 7 112 if x == 0 { 113 break 114 } 115 } 116 return n 117 } 118 119 // EncodeFixed64 writes a 64-bit integer to the Buffer. 120 // This is the format for the 121 // fixed64, sfixed64, and double protocol buffer types. 122 func (p *Buffer) EncodeFixed64(x uint64) error { 123 p.buf = append(p.buf, 124 uint8(x), 125 uint8(x>>8), 126 uint8(x>>16), 127 uint8(x>>24), 128 uint8(x>>32), 129 uint8(x>>40), 130 uint8(x>>48), 131 uint8(x>>56)) 132 return nil 133 } 134 135 func sizeFixed64(x uint64) int { 136 return 8 137 } 138 139 // EncodeFixed32 writes a 32-bit integer to the Buffer. 140 // This is the format for the 141 // fixed32, sfixed32, and float protocol buffer types. 142 func (p *Buffer) EncodeFixed32(x uint64) error { 143 p.buf = append(p.buf, 144 uint8(x), 145 uint8(x>>8), 146 uint8(x>>16), 147 uint8(x>>24)) 148 return nil 149 } 150 151 func sizeFixed32(x uint64) int { 152 return 4 153 } 154 155 // EncodeZigzag64 writes a zigzag-encoded 64-bit integer 156 // to the Buffer. 157 // This is the format used for the sint64 protocol buffer type. 158 func (p *Buffer) EncodeZigzag64(x uint64) error { 159 // use signed number to get arithmetic right shift. 160 return p.EncodeVarint(uint64((x << 1) ^ uint64((int64(x) >> 63)))) 161 } 162 163 func sizeZigzag64(x uint64) int { 164 return sizeVarint(uint64((x << 1) ^ uint64((int64(x) >> 63)))) 165 } 166 167 // EncodeZigzag32 writes a zigzag-encoded 32-bit integer 168 // to the Buffer. 169 // This is the format used for the sint32 protocol buffer type. 170 func (p *Buffer) EncodeZigzag32(x uint64) error { 171 // use signed number to get arithmetic right shift. 172 return p.EncodeVarint(uint64((uint32(x) << 1) ^ uint32((int32(x) >> 31)))) 173 } 174 175 func sizeZigzag32(x uint64) int { 176 return sizeVarint(uint64((uint32(x) << 1) ^ uint32((int32(x) >> 31)))) 177 } 178 179 // EncodeRawBytes writes a count-delimited byte buffer to the Buffer. 180 // This is the format used for the bytes protocol buffer 181 // type and for embedded messages. 182 func (p *Buffer) EncodeRawBytes(b []byte) error { 183 p.EncodeVarint(uint64(len(b))) 184 p.buf = append(p.buf, b...) 185 return nil 186 } 187 188 func sizeRawBytes(b []byte) int { 189 return sizeVarint(uint64(len(b))) + 190 len(b) 191 } 192 193 // EncodeStringBytes writes an encoded string to the Buffer. 194 // This is the format used for the proto2 string type. 195 func (p *Buffer) EncodeStringBytes(s string) error { 196 p.EncodeVarint(uint64(len(s))) 197 p.buf = append(p.buf, s...) 198 return nil 199 } 200 201 func sizeStringBytes(s string) int { 202 return sizeVarint(uint64(len(s))) + 203 len(s) 204 } 205 206 // Marshaler is the interface representing objects that can marshal themselves. 207 type Marshaler interface { 208 Marshal() ([]byte, error) 209 } 210 211 // Marshal takes the protocol buffer 212 // and encodes it into the wire format, returning the data. 213 func Marshal(pb Message) ([]byte, error) { 214 // Can the object marshal itself? 215 if m, ok := pb.(Marshaler); ok { 216 return m.Marshal() 217 } 218 p := NewBuffer(nil) 219 err := p.Marshal(pb) 220 var state errorState 221 if err != nil && !state.shouldContinue(err, nil) { 222 return nil, err 223 } 224 if p.buf == nil && err == nil { 225 // Return a non-nil slice on success. 226 return []byte{}, nil 227 } 228 return p.buf, err 229 } 230 231 // Marshal takes the protocol buffer 232 // and encodes it into the wire format, writing the result to the 233 // Buffer. 234 func (p *Buffer) Marshal(pb Message) error { 235 // Can the object marshal itself? 236 if m, ok := pb.(Marshaler); ok { 237 data, err := m.Marshal() 238 if err != nil { 239 return err 240 } 241 p.buf = append(p.buf, data...) 242 return nil 243 } 244 245 t, base, err := getbase(pb) 246 if structPointer_IsNil(base) { 247 return ErrNil 248 } 249 if err == nil { 250 err = p.enc_struct(t.Elem(), GetProperties(t.Elem()), base) 251 } 252 253 if collectStats { 254 stats.Encode++ 255 } 256 257 return err 258 } 259 260 // Size returns the encoded size of a protocol buffer. 261 func Size(pb Message) (n int) { 262 // Can the object marshal itself? If so, Size is slow. 263 // TODO: add Size to Marshaler, or add a Sizer interface. 264 if m, ok := pb.(Marshaler); ok { 265 b, _ := m.Marshal() 266 return len(b) 267 } 268 269 t, base, err := getbase(pb) 270 if structPointer_IsNil(base) { 271 return 0 272 } 273 if err == nil { 274 n = size_struct(t.Elem(), GetProperties(t.Elem()), base) 275 } 276 277 if collectStats { 278 stats.Size++ 279 } 280 281 return 282 } 283 284 // Individual type encoders. 285 286 // Encode a bool. 287 func (o *Buffer) enc_bool(p *Properties, base structPointer) error { 288 v := *structPointer_Bool(base, p.field) 289 if v == nil { 290 return ErrNil 291 } 292 x := 0 293 if *v { 294 x = 1 295 } 296 o.buf = append(o.buf, p.tagcode...) 297 p.valEnc(o, uint64(x)) 298 return nil 299 } 300 301 func size_bool(p *Properties, base structPointer) int { 302 v := *structPointer_Bool(base, p.field) 303 if v == nil { 304 return 0 305 } 306 return len(p.tagcode) + 1 // each bool takes exactly one byte 307 } 308 309 // Encode an int32. 310 func (o *Buffer) enc_int32(p *Properties, base structPointer) error { 311 v := structPointer_Word32(base, p.field) 312 if word32_IsNil(v) { 313 return ErrNil 314 } 315 x := word32_Get(v) 316 o.buf = append(o.buf, p.tagcode...) 317 p.valEnc(o, uint64(x)) 318 return nil 319 } 320 321 func size_int32(p *Properties, base structPointer) (n int) { 322 v := structPointer_Word32(base, p.field) 323 if word32_IsNil(v) { 324 return 0 325 } 326 x := word32_Get(v) 327 n += len(p.tagcode) 328 n += p.valSize(uint64(x)) 329 return 330 } 331 332 // Encode an int64. 333 func (o *Buffer) enc_int64(p *Properties, base structPointer) error { 334 v := structPointer_Word64(base, p.field) 335 if word64_IsNil(v) { 336 return ErrNil 337 } 338 x := word64_Get(v) 339 o.buf = append(o.buf, p.tagcode...) 340 p.valEnc(o, x) 341 return nil 342 } 343 344 func size_int64(p *Properties, base structPointer) (n int) { 345 v := structPointer_Word64(base, p.field) 346 if word64_IsNil(v) { 347 return 0 348 } 349 x := word64_Get(v) 350 n += len(p.tagcode) 351 n += p.valSize(x) 352 return 353 } 354 355 // Encode a string. 356 func (o *Buffer) enc_string(p *Properties, base structPointer) error { 357 v := *structPointer_String(base, p.field) 358 if v == nil { 359 return ErrNil 360 } 361 x := *v 362 o.buf = append(o.buf, p.tagcode...) 363 o.EncodeStringBytes(x) 364 return nil 365 } 366 367 func size_string(p *Properties, base structPointer) (n int) { 368 v := *structPointer_String(base, p.field) 369 if v == nil { 370 return 0 371 } 372 x := *v 373 n += len(p.tagcode) 374 n += sizeStringBytes(x) 375 return 376 } 377 378 // All protocol buffer fields are nillable, but be careful. 379 func isNil(v reflect.Value) bool { 380 switch v.Kind() { 381 case reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice: 382 return v.IsNil() 383 } 384 return false 385 } 386 387 // Encode a message struct. 388 func (o *Buffer) enc_struct_message(p *Properties, base structPointer) error { 389 var state errorState 390 structp := structPointer_GetStructPointer(base, p.field) 391 if structPointer_IsNil(structp) { 392 return ErrNil 393 } 394 395 // Can the object marshal itself? 396 if p.isMarshaler { 397 m := structPointer_Interface(structp, p.stype).(Marshaler) 398 data, err := m.Marshal() 399 if err != nil && !state.shouldContinue(err, nil) { 400 return err 401 } 402 o.buf = append(o.buf, p.tagcode...) 403 o.EncodeRawBytes(data) 404 return nil 405 } 406 407 o.buf = append(o.buf, p.tagcode...) 408 return o.enc_len_struct(p.stype, p.sprop, structp, &state) 409 } 410 411 func size_struct_message(p *Properties, base structPointer) int { 412 structp := structPointer_GetStructPointer(base, p.field) 413 if structPointer_IsNil(structp) { 414 return 0 415 } 416 417 // Can the object marshal itself? 418 if p.isMarshaler { 419 m := structPointer_Interface(structp, p.stype).(Marshaler) 420 data, _ := m.Marshal() 421 n0 := len(p.tagcode) 422 n1 := sizeRawBytes(data) 423 return n0 + n1 424 } 425 426 n0 := len(p.tagcode) 427 n1 := size_struct(p.stype, p.sprop, structp) 428 n2 := sizeVarint(uint64(n1)) // size of encoded length 429 return n0 + n1 + n2 430 } 431 432 // Encode a group struct. 433 func (o *Buffer) enc_struct_group(p *Properties, base structPointer) error { 434 var state errorState 435 b := structPointer_GetStructPointer(base, p.field) 436 if structPointer_IsNil(b) { 437 return ErrNil 438 } 439 440 o.EncodeVarint(uint64((p.Tag << 3) | WireStartGroup)) 441 err := o.enc_struct(p.stype, p.sprop, b) 442 if err != nil && !state.shouldContinue(err, nil) { 443 return err 444 } 445 o.EncodeVarint(uint64((p.Tag << 3) | WireEndGroup)) 446 return state.err 447 } 448 449 func size_struct_group(p *Properties, base structPointer) (n int) { 450 b := structPointer_GetStructPointer(base, p.field) 451 if structPointer_IsNil(b) { 452 return 0 453 } 454 455 n += sizeVarint(uint64((p.Tag << 3) | WireStartGroup)) 456 n += size_struct(p.stype, p.sprop, b) 457 n += sizeVarint(uint64((p.Tag << 3) | WireEndGroup)) 458 return 459 } 460 461 // Encode a slice of bools ([]bool). 462 func (o *Buffer) enc_slice_bool(p *Properties, base structPointer) error { 463 s := *structPointer_BoolSlice(base, p.field) 464 l := len(s) 465 if l == 0 { 466 return ErrNil 467 } 468 for _, x := range s { 469 o.buf = append(o.buf, p.tagcode...) 470 v := uint64(0) 471 if x { 472 v = 1 473 } 474 p.valEnc(o, v) 475 } 476 return nil 477 } 478 479 func size_slice_bool(p *Properties, base structPointer) int { 480 s := *structPointer_BoolSlice(base, p.field) 481 l := len(s) 482 if l == 0 { 483 return 0 484 } 485 return l * (len(p.tagcode) + 1) // each bool takes exactly one byte 486 } 487 488 // Encode a slice of bools ([]bool) in packed format. 489 func (o *Buffer) enc_slice_packed_bool(p *Properties, base structPointer) error { 490 s := *structPointer_BoolSlice(base, p.field) 491 l := len(s) 492 if l == 0 { 493 return ErrNil 494 } 495 o.buf = append(o.buf, p.tagcode...) 496 o.EncodeVarint(uint64(l)) // each bool takes exactly one byte 497 for _, x := range s { 498 v := uint64(0) 499 if x { 500 v = 1 501 } 502 p.valEnc(o, v) 503 } 504 return nil 505 } 506 507 func size_slice_packed_bool(p *Properties, base structPointer) (n int) { 508 s := *structPointer_BoolSlice(base, p.field) 509 l := len(s) 510 if l == 0 { 511 return 0 512 } 513 n += len(p.tagcode) 514 n += sizeVarint(uint64(l)) 515 n += l // each bool takes exactly one byte 516 return 517 } 518 519 // Encode a slice of bytes ([]byte). 520 func (o *Buffer) enc_slice_byte(p *Properties, base structPointer) error { 521 s := *structPointer_Bytes(base, p.field) 522 if s == nil { 523 return ErrNil 524 } 525 o.buf = append(o.buf, p.tagcode...) 526 o.EncodeRawBytes(s) 527 return nil 528 } 529 530 func size_slice_byte(p *Properties, base structPointer) (n int) { 531 s := *structPointer_Bytes(base, p.field) 532 if s == nil { 533 return 0 534 } 535 n += len(p.tagcode) 536 n += sizeRawBytes(s) 537 return 538 } 539 540 // Encode a slice of int32s ([]int32). 541 func (o *Buffer) enc_slice_int32(p *Properties, base structPointer) error { 542 s := structPointer_Word32Slice(base, p.field) 543 l := s.Len() 544 if l == 0 { 545 return ErrNil 546 } 547 for i := 0; i < l; i++ { 548 o.buf = append(o.buf, p.tagcode...) 549 x := s.Index(i) 550 p.valEnc(o, uint64(x)) 551 } 552 return nil 553 } 554 555 func size_slice_int32(p *Properties, base structPointer) (n int) { 556 s := structPointer_Word32Slice(base, p.field) 557 l := s.Len() 558 if l == 0 { 559 return 0 560 } 561 for i := 0; i < l; i++ { 562 n += len(p.tagcode) 563 x := s.Index(i) 564 n += p.valSize(uint64(x)) 565 } 566 return 567 } 568 569 // Encode a slice of int32s ([]int32) in packed format. 570 func (o *Buffer) enc_slice_packed_int32(p *Properties, base structPointer) error { 571 s := structPointer_Word32Slice(base, p.field) 572 l := s.Len() 573 if l == 0 { 574 return ErrNil 575 } 576 // TODO: Reuse a Buffer. 577 buf := NewBuffer(nil) 578 for i := 0; i < l; i++ { 579 p.valEnc(buf, uint64(s.Index(i))) 580 } 581 582 o.buf = append(o.buf, p.tagcode...) 583 o.EncodeVarint(uint64(len(buf.buf))) 584 o.buf = append(o.buf, buf.buf...) 585 return nil 586 } 587 588 func size_slice_packed_int32(p *Properties, base structPointer) (n int) { 589 s := structPointer_Word32Slice(base, p.field) 590 l := s.Len() 591 if l == 0 { 592 return 0 593 } 594 var bufSize int 595 for i := 0; i < l; i++ { 596 bufSize += p.valSize(uint64(s.Index(i))) 597 } 598 599 n += len(p.tagcode) 600 n += sizeVarint(uint64(bufSize)) 601 n += bufSize 602 return 603 } 604 605 // Encode a slice of int64s ([]int64). 606 func (o *Buffer) enc_slice_int64(p *Properties, base structPointer) error { 607 s := structPointer_Word64Slice(base, p.field) 608 l := s.Len() 609 if l == 0 { 610 return ErrNil 611 } 612 for i := 0; i < l; i++ { 613 o.buf = append(o.buf, p.tagcode...) 614 p.valEnc(o, s.Index(i)) 615 } 616 return nil 617 } 618 619 func size_slice_int64(p *Properties, base structPointer) (n int) { 620 s := structPointer_Word64Slice(base, p.field) 621 l := s.Len() 622 if l == 0 { 623 return 0 624 } 625 for i := 0; i < l; i++ { 626 n += len(p.tagcode) 627 n += p.valSize(s.Index(i)) 628 } 629 return 630 } 631 632 // Encode a slice of int64s ([]int64) in packed format. 633 func (o *Buffer) enc_slice_packed_int64(p *Properties, base structPointer) error { 634 s := structPointer_Word64Slice(base, p.field) 635 l := s.Len() 636 if l == 0 { 637 return ErrNil 638 } 639 // TODO: Reuse a Buffer. 640 buf := NewBuffer(nil) 641 for i := 0; i < l; i++ { 642 p.valEnc(buf, s.Index(i)) 643 } 644 645 o.buf = append(o.buf, p.tagcode...) 646 o.EncodeVarint(uint64(len(buf.buf))) 647 o.buf = append(o.buf, buf.buf...) 648 return nil 649 } 650 651 func size_slice_packed_int64(p *Properties, base structPointer) (n int) { 652 s := structPointer_Word64Slice(base, p.field) 653 l := s.Len() 654 if l == 0 { 655 return 0 656 } 657 var bufSize int 658 for i := 0; i < l; i++ { 659 bufSize += p.valSize(s.Index(i)) 660 } 661 662 n += len(p.tagcode) 663 n += sizeVarint(uint64(bufSize)) 664 n += bufSize 665 return 666 } 667 668 // Encode a slice of slice of bytes ([][]byte). 669 func (o *Buffer) enc_slice_slice_byte(p *Properties, base structPointer) error { 670 ss := *structPointer_BytesSlice(base, p.field) 671 l := len(ss) 672 if l == 0 { 673 return ErrNil 674 } 675 for i := 0; i < l; i++ { 676 o.buf = append(o.buf, p.tagcode...) 677 o.EncodeRawBytes(ss[i]) 678 } 679 return nil 680 } 681 682 func size_slice_slice_byte(p *Properties, base structPointer) (n int) { 683 ss := *structPointer_BytesSlice(base, p.field) 684 l := len(ss) 685 if l == 0 { 686 return 0 687 } 688 n += l * len(p.tagcode) 689 for i := 0; i < l; i++ { 690 n += sizeRawBytes(ss[i]) 691 } 692 return 693 } 694 695 // Encode a slice of strings ([]string). 696 func (o *Buffer) enc_slice_string(p *Properties, base structPointer) error { 697 ss := *structPointer_StringSlice(base, p.field) 698 l := len(ss) 699 for i := 0; i < l; i++ { 700 o.buf = append(o.buf, p.tagcode...) 701 o.EncodeStringBytes(ss[i]) 702 } 703 return nil 704 } 705 706 func size_slice_string(p *Properties, base structPointer) (n int) { 707 ss := *structPointer_StringSlice(base, p.field) 708 l := len(ss) 709 n += l * len(p.tagcode) 710 for i := 0; i < l; i++ { 711 n += sizeStringBytes(ss[i]) 712 } 713 return 714 } 715 716 // Encode a slice of message structs ([]*struct). 717 func (o *Buffer) enc_slice_struct_message(p *Properties, base structPointer) error { 718 var state errorState 719 s := structPointer_StructPointerSlice(base, p.field) 720 l := s.Len() 721 722 for i := 0; i < l; i++ { 723 structp := s.Index(i) 724 if structPointer_IsNil(structp) { 725 return ErrRepeatedHasNil 726 } 727 728 // Can the object marshal itself? 729 if p.isMarshaler { 730 m := structPointer_Interface(structp, p.stype).(Marshaler) 731 data, err := m.Marshal() 732 if err != nil && !state.shouldContinue(err, nil) { 733 return err 734 } 735 o.buf = append(o.buf, p.tagcode...) 736 o.EncodeRawBytes(data) 737 continue 738 } 739 740 o.buf = append(o.buf, p.tagcode...) 741 err := o.enc_len_struct(p.stype, p.sprop, structp, &state) 742 if err != nil && !state.shouldContinue(err, nil) { 743 if err == ErrNil { 744 return ErrRepeatedHasNil 745 } 746 return err 747 } 748 } 749 return state.err 750 } 751 752 func size_slice_struct_message(p *Properties, base structPointer) (n int) { 753 s := structPointer_StructPointerSlice(base, p.field) 754 l := s.Len() 755 n += l * len(p.tagcode) 756 for i := 0; i < l; i++ { 757 structp := s.Index(i) 758 if structPointer_IsNil(structp) { 759 return // return the size up to this point 760 } 761 762 // Can the object marshal itself? 763 if p.isMarshaler { 764 m := structPointer_Interface(structp, p.stype).(Marshaler) 765 data, _ := m.Marshal() 766 n += len(p.tagcode) 767 n += sizeRawBytes(data) 768 continue 769 } 770 771 n0 := size_struct(p.stype, p.sprop, structp) 772 n1 := sizeVarint(uint64(n0)) // size of encoded length 773 n += n0 + n1 774 } 775 return 776 } 777 778 // Encode a slice of group structs ([]*struct). 779 func (o *Buffer) enc_slice_struct_group(p *Properties, base structPointer) error { 780 var state errorState 781 s := structPointer_StructPointerSlice(base, p.field) 782 l := s.Len() 783 784 for i := 0; i < l; i++ { 785 b := s.Index(i) 786 if structPointer_IsNil(b) { 787 return ErrRepeatedHasNil 788 } 789 790 o.EncodeVarint(uint64((p.Tag << 3) | WireStartGroup)) 791 792 err := o.enc_struct(p.stype, p.sprop, b) 793 794 if err != nil && !state.shouldContinue(err, nil) { 795 if err == ErrNil { 796 return ErrRepeatedHasNil 797 } 798 return err 799 } 800 801 o.EncodeVarint(uint64((p.Tag << 3) | WireEndGroup)) 802 } 803 return state.err 804 } 805 806 func size_slice_struct_group(p *Properties, base structPointer) (n int) { 807 s := structPointer_StructPointerSlice(base, p.field) 808 l := s.Len() 809 810 n += l * sizeVarint(uint64((p.Tag<<3)|WireStartGroup)) 811 n += l * sizeVarint(uint64((p.Tag<<3)|WireEndGroup)) 812 for i := 0; i < l; i++ { 813 b := s.Index(i) 814 if structPointer_IsNil(b) { 815 return // return size up to this point 816 } 817 818 n += size_struct(p.stype, p.sprop, b) 819 } 820 return 821 } 822 823 // Encode an extension map. 824 func (o *Buffer) enc_map(p *Properties, base structPointer) error { 825 v := *structPointer_ExtMap(base, p.field) 826 if err := encodeExtensionMap(v); err != nil { 827 return err 828 } 829 // Fast-path for common cases: zero or one extensions. 830 if len(v) <= 1 { 831 for _, e := range v { 832 o.buf = append(o.buf, e.enc...) 833 } 834 return nil 835 } 836 837 // Sort keys to provide a deterministic encoding. 838 keys := make([]int, 0, len(v)) 839 for k := range v { 840 keys = append(keys, int(k)) 841 } 842 sort.Ints(keys) 843 844 for _, k := range keys { 845 o.buf = append(o.buf, v[int32(k)].enc...) 846 } 847 return nil 848 } 849 850 func size_map(p *Properties, base structPointer) int { 851 v := *structPointer_ExtMap(base, p.field) 852 return sizeExtensionMap(v) 853 } 854 855 // Encode a struct. 856 func (o *Buffer) enc_struct(t reflect.Type, prop *StructProperties, base structPointer) error { 857 var state errorState 858 // Encode fields in tag order so that decoders may use optimizations 859 // that depend on the ordering. 860 // http://code.google.com/apis/protocolbuffers/docs/encoding.html#order 861 for _, i := range prop.order { 862 p := prop.Prop[i] 863 if p.enc != nil { 864 err := p.enc(o, p, base) 865 if err != nil { 866 if err == ErrNil { 867 if p.Required && state.err == nil { 868 state.err = &RequiredNotSetError{p.Name} 869 } 870 } else if !state.shouldContinue(err, p) { 871 return err 872 } 873 } 874 } 875 } 876 877 // Add unrecognized fields at the end. 878 if prop.unrecField.IsValid() { 879 v := *structPointer_Bytes(base, prop.unrecField) 880 if len(v) > 0 { 881 o.buf = append(o.buf, v...) 882 } 883 } 884 885 return state.err 886 } 887 888 func size_struct(t reflect.Type, prop *StructProperties, base structPointer) (n int) { 889 for _, i := range prop.order { 890 p := prop.Prop[i] 891 if p.size != nil { 892 n += p.size(p, base) 893 } 894 } 895 896 // Add unrecognized fields at the end. 897 if prop.unrecField.IsValid() { 898 v := *structPointer_Bytes(base, prop.unrecField) 899 n += len(v) 900 } 901 902 return 903 } 904 905 var zeroes [20]byte // longer than any conceivable sizeVarint 906 907 // Encode a struct, preceded by its encoded length (as a varint). 908 func (o *Buffer) enc_len_struct(t reflect.Type, prop *StructProperties, base structPointer, state *errorState) error { 909 iLen := len(o.buf) 910 o.buf = append(o.buf, 0, 0, 0, 0) // reserve four bytes for length 911 iMsg := len(o.buf) 912 err := o.enc_struct(t, prop, base) 913 if err != nil && !state.shouldContinue(err, nil) { 914 return err 915 } 916 lMsg := len(o.buf) - iMsg 917 lLen := sizeVarint(uint64(lMsg)) 918 switch x := lLen - (iMsg - iLen); { 919 case x > 0: // actual length is x bytes larger than the space we reserved 920 // Move msg x bytes right. 921 o.buf = append(o.buf, zeroes[:x]...) 922 copy(o.buf[iMsg+x:], o.buf[iMsg:iMsg+lMsg]) 923 case x < 0: // actual length is x bytes smaller than the space we reserved 924 // Move msg x bytes left. 925 copy(o.buf[iMsg+x:], o.buf[iMsg:iMsg+lMsg]) 926 o.buf = o.buf[:len(o.buf)+x] // x is negative 927 } 928 // Encode the length in the reserved space. 929 o.buf = o.buf[:iLen] 930 o.EncodeVarint(uint64(lMsg)) 931 o.buf = o.buf[:len(o.buf)+lMsg] 932 return state.err 933 } 934 935 // errorState maintains the first error that occurs and updates that error 936 // with additional context. 937 type errorState struct { 938 err error 939 } 940 941 // shouldContinue reports whether encoding should continue upon encountering the 942 // given error. If the error is RequiredNotSetError, shouldContinue returns true 943 // and, if this is the first appearance of that error, remembers it for future 944 // reporting. 945 // 946 // If prop is not nil, it may update any error with additional context about the 947 // field with the error. 948 func (s *errorState) shouldContinue(err error, prop *Properties) bool { 949 // Ignore unset required fields. 950 reqNotSet, ok := err.(*RequiredNotSetError) 951 if !ok { 952 return false 953 } 954 if s.err == nil { 955 if prop != nil { 956 err = &RequiredNotSetError{prop.Name + "." + reqNotSet.field} 957 } 958 s.err = err 959 } 960 return true 961 }