protoutil.go 469 B

123456789101112131415161718192021222324
  1. package protoutil
  2. import (
  3. "fmt"
  4. "google.golang.org/protobuf/proto"
  5. )
  6. func MarshalTo(buf []byte, pb proto.Message) (int, error) {
  7. if sz := proto.Size(pb); len(buf) < sz {
  8. return 0, fmt.Errorf("buffer too small")
  9. } else if sz == 0 {
  10. return 0, nil
  11. }
  12. opts := proto.MarshalOptions{}
  13. bs, err := opts.MarshalAppend(buf[:0], pb)
  14. if err != nil {
  15. return 0, err
  16. }
  17. if &buf[0] != &bs[0] {
  18. panic("can't happen: slice was reallocated")
  19. }
  20. return len(bs), nil
  21. }