blob: 6068671b88f6ef1d3e0701d62925be7e7b994cd4 [file] [log] [blame]
Damien Neilc37adef2019-04-01 13:49:56 -07001// Copyright 2019 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package main
6
7import (
8 "text/template"
9)
10
Damien Neiledf7bdd2019-07-08 12:46:01 -070011func generateImplCodec() string {
12 return mustExecute(implCodecTemplate, ProtoKinds)
Damien Neilc37adef2019-04-01 13:49:56 -070013}
14
Damien Neiledf7bdd2019-07-08 12:46:01 -070015var implCodecTemplate = template.Must(template.New("").Parse(`
Damien Neilc37adef2019-04-01 13:49:56 -070016{{- /*
17 IsZero is an expression testing if 'v' is the zero value.
18*/ -}}
19{{- define "IsZero" -}}
20{{if eq .WireType "Bytes" -}}
21len(v) == 0
22{{- else if or (eq .Name "Double") (eq .Name "Float") -}}
23v == 0 && !math.Signbit(float64(v))
24{{- else -}}
25v == {{.GoType.Zero}}
26{{- end -}}
27{{- end -}}
28
29{{- /*
30 Size is an expression computing the size of 'v'.
31*/ -}}
32{{- define "Size" -}}
33{{- if .WireType.ConstSize -}}
Joe Tsaicd108d02020-02-14 18:08:02 -080034protowire.Size{{.WireType}}()
Damien Neilc37adef2019-04-01 13:49:56 -070035{{- else if eq .WireType "Bytes" -}}
Joe Tsaicd108d02020-02-14 18:08:02 -080036protowire.SizeBytes(len({{.FromGoType}}))
Damien Neilc37adef2019-04-01 13:49:56 -070037{{- else -}}
Joe Tsaicd108d02020-02-14 18:08:02 -080038protowire.Size{{.WireType}}({{.FromGoType}})
Damien Neilc37adef2019-04-01 13:49:56 -070039{{- end -}}
40{{- end -}}
41
Damien Neil68b81c32019-08-22 11:41:32 -070042{{- define "SizeValue" -}}
43{{- if .WireType.ConstSize -}}
Joe Tsaicd108d02020-02-14 18:08:02 -080044protowire.Size{{.WireType}}()
Damien Neil68b81c32019-08-22 11:41:32 -070045{{- else if eq .WireType "Bytes" -}}
Joe Tsaicd108d02020-02-14 18:08:02 -080046protowire.SizeBytes(len({{.FromValue}}))
Damien Neil68b81c32019-08-22 11:41:32 -070047{{- else -}}
Joe Tsaicd108d02020-02-14 18:08:02 -080048protowire.Size{{.WireType}}({{.FromValue}})
Damien Neil68b81c32019-08-22 11:41:32 -070049{{- end -}}
50{{- end -}}
51
Damien Neilc37adef2019-04-01 13:49:56 -070052{{- /*
53 Append is a set of statements appending 'v' to 'b'.
54*/ -}}
55{{- define "Append" -}}
Damien Neilcedb5952019-06-21 12:04:07 -070056{{- if eq .Name "String" -}}
Joe Tsaicd108d02020-02-14 18:08:02 -080057b = protowire.AppendString(b, {{.FromGoType}})
Damien Neilcedb5952019-06-21 12:04:07 -070058{{- else -}}
Joe Tsaicd108d02020-02-14 18:08:02 -080059b = protowire.Append{{.WireType}}(b, {{.FromGoType}})
Damien Neilc37adef2019-04-01 13:49:56 -070060{{- end -}}
Damien Neilcedb5952019-06-21 12:04:07 -070061{{- end -}}
Damien Neilc37adef2019-04-01 13:49:56 -070062
Damien Neil68b81c32019-08-22 11:41:32 -070063{{- define "AppendValue" -}}
64{{- if eq .Name "String" -}}
Joe Tsaicd108d02020-02-14 18:08:02 -080065b = protowire.AppendString(b, {{.FromValue}})
Damien Neil68b81c32019-08-22 11:41:32 -070066{{- else -}}
Joe Tsaicd108d02020-02-14 18:08:02 -080067b = protowire.Append{{.WireType}}(b, {{.FromValue}})
Damien Neil68b81c32019-08-22 11:41:32 -070068{{- end -}}
69{{- end -}}
70
Damien Neile91877d2019-06-27 10:54:42 -070071{{- define "Consume" -}}
72{{- if eq .Name "String" -}}
Joe Tsaicd108d02020-02-14 18:08:02 -080073v, n := protowire.ConsumeString(b)
Damien Neiladbbc8e2020-01-24 17:01:14 -080074{{- else if eq .WireType "Varint" -}}
75var v uint64
76var n int
77if len(b) >= 1 && b[0] < 0x80 {
78 v = uint64(b[0])
79 n = 1
80} else if len(b) >= 2 && b[1] < 128 {
81 v = uint64(b[0]&0x7f) + uint64(b[1])<<7
82 n = 2
83} else {
Joe Tsaicd108d02020-02-14 18:08:02 -080084 v, n = protowire.ConsumeVarint(b)
Damien Neiladbbc8e2020-01-24 17:01:14 -080085}
Damien Neile91877d2019-06-27 10:54:42 -070086{{- else -}}
Joe Tsaicd108d02020-02-14 18:08:02 -080087v, n := protowire.Consume{{.WireType}}(b)
Damien Neile91877d2019-06-27 10:54:42 -070088{{- end -}}
89{{- end -}}
90
Damien Neilc37adef2019-04-01 13:49:56 -070091{{- range .}}
Damien Neil68b81c32019-08-22 11:41:32 -070092
Damien Neilc37adef2019-04-01 13:49:56 -070093{{- if .FromGoType }}
94// size{{.Name}} returns the size of wire encoding a {{.GoType}} pointer as a {{.Name}}.
Damien Neil316febd2020-02-09 12:26:50 -080095func size{{.Name}}(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
Damien Neilc37adef2019-04-01 13:49:56 -070096 {{if not .WireType.ConstSize -}}
97 v := *p.{{.GoType.PointerMethod}}()
98 {{- end}}
Damien Neil316febd2020-02-09 12:26:50 -080099 return f.tagsize + {{template "Size" .}}
Damien Neilc37adef2019-04-01 13:49:56 -0700100}
101
102// append{{.Name}} wire encodes a {{.GoType}} pointer as a {{.Name}}.
Damien Neil316febd2020-02-09 12:26:50 -0800103func append{{.Name}}(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
Damien Neilc37adef2019-04-01 13:49:56 -0700104 v := *p.{{.GoType.PointerMethod}}()
Joe Tsaicd108d02020-02-14 18:08:02 -0800105 b = protowire.AppendVarint(b, f.wiretag)
Damien Neilc37adef2019-04-01 13:49:56 -0700106 {{template "Append" .}}
107 return b, nil
108}
109
Damien Neile91877d2019-06-27 10:54:42 -0700110// consume{{.Name}} wire decodes a {{.GoType}} pointer as a {{.Name}}.
Joe Tsaicd108d02020-02-14 18:08:02 -0800111func consume{{.Name}}(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
Damien Neile91877d2019-06-27 10:54:42 -0700112 if wtyp != {{.WireType.Expr}} {
Damien Neilf0831e82020-01-21 14:25:12 -0800113 return out, errUnknown
Damien Neile91877d2019-06-27 10:54:42 -0700114 }
Damien Neiladbbc8e2020-01-24 17:01:14 -0800115 {{template "Consume" .}}
Damien Neile91877d2019-06-27 10:54:42 -0700116 if n < 0 {
Joe Tsaicd108d02020-02-14 18:08:02 -0800117 return out, protowire.ParseError(n)
Damien Neile91877d2019-06-27 10:54:42 -0700118 }
119 *p.{{.GoType.PointerMethod}}() = {{.ToGoType}}
Damien Neilf0831e82020-01-21 14:25:12 -0800120 out.n = n
121 return out, nil
Damien Neile91877d2019-06-27 10:54:42 -0700122}
123
Damien Neilc37adef2019-04-01 13:49:56 -0700124var coder{{.Name}} = pointerCoderFuncs{
Damien Neile91877d2019-06-27 10:54:42 -0700125 size: size{{.Name}},
126 marshal: append{{.Name}},
127 unmarshal: consume{{.Name}},
Damien Neile8e88752020-02-11 11:25:16 -0800128 merge: merge{{.GoType.PointerMethod}},
Damien Neilc37adef2019-04-01 13:49:56 -0700129}
130
Joe Tsaic51e2e02019-07-13 00:44:41 -0700131{{if or (eq .Name "Bytes") (eq .Name "String")}}
132// append{{.Name}}ValidateUTF8 wire encodes a {{.GoType}} pointer as a {{.Name}}.
Damien Neil316febd2020-02-09 12:26:50 -0800133func append{{.Name}}ValidateUTF8(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
Joe Tsaic51e2e02019-07-13 00:44:41 -0700134 v := *p.{{.GoType.PointerMethod}}()
Joe Tsaicd108d02020-02-14 18:08:02 -0800135 b = protowire.AppendVarint(b, f.wiretag)
Joe Tsaic51e2e02019-07-13 00:44:41 -0700136 {{template "Append" .}}
137 if !utf8.Valid{{if eq .Name "String"}}String{{end}}(v) {
138 return b, errInvalidUTF8{}
139 }
140 return b, nil
141}
142
143// consume{{.Name}}ValidateUTF8 wire decodes a {{.GoType}} pointer as a {{.Name}}.
Joe Tsaicd108d02020-02-14 18:08:02 -0800144func consume{{.Name}}ValidateUTF8(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
Joe Tsaic51e2e02019-07-13 00:44:41 -0700145 if wtyp != {{.WireType.Expr}} {
Damien Neilf0831e82020-01-21 14:25:12 -0800146 return out, errUnknown
Joe Tsaic51e2e02019-07-13 00:44:41 -0700147 }
Damien Neiladbbc8e2020-01-24 17:01:14 -0800148 {{template "Consume" .}}
Joe Tsaic51e2e02019-07-13 00:44:41 -0700149 if n < 0 {
Joe Tsaicd108d02020-02-14 18:08:02 -0800150 return out, protowire.ParseError(n)
Joe Tsaic51e2e02019-07-13 00:44:41 -0700151 }
152 if !utf8.Valid{{if eq .Name "String"}}String{{end}}(v) {
Damien Neilf0831e82020-01-21 14:25:12 -0800153 return out, errInvalidUTF8{}
Joe Tsaic51e2e02019-07-13 00:44:41 -0700154 }
155 *p.{{.GoType.PointerMethod}}() = {{.ToGoType}}
Damien Neilf0831e82020-01-21 14:25:12 -0800156 out.n = n
157 return out, nil
Joe Tsaic51e2e02019-07-13 00:44:41 -0700158}
159
160var coder{{.Name}}ValidateUTF8 = pointerCoderFuncs{
161 size: size{{.Name}},
162 marshal: append{{.Name}}ValidateUTF8,
163 unmarshal: consume{{.Name}}ValidateUTF8,
Damien Neile8e88752020-02-11 11:25:16 -0800164 merge: merge{{.GoType.PointerMethod}},
Joe Tsaic51e2e02019-07-13 00:44:41 -0700165}
166{{end}}
167
168// size{{.Name}}NoZero returns the size of wire encoding a {{.GoType}} pointer as a {{.Name}}.
Damien Neilc37adef2019-04-01 13:49:56 -0700169// The zero value is not encoded.
Damien Neil316febd2020-02-09 12:26:50 -0800170func size{{.Name}}NoZero(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
Damien Neilc37adef2019-04-01 13:49:56 -0700171 v := *p.{{.GoType.PointerMethod}}()
172 if {{template "IsZero" .}} {
173 return 0
174 }
Damien Neil316febd2020-02-09 12:26:50 -0800175 return f.tagsize + {{template "Size" .}}
Damien Neilc37adef2019-04-01 13:49:56 -0700176}
177
Joe Tsaic51e2e02019-07-13 00:44:41 -0700178// append{{.Name}}NoZero wire encodes a {{.GoType}} pointer as a {{.Name}}.
Damien Neilc37adef2019-04-01 13:49:56 -0700179// The zero value is not encoded.
Damien Neil316febd2020-02-09 12:26:50 -0800180func append{{.Name}}NoZero(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
Damien Neilc37adef2019-04-01 13:49:56 -0700181 v := *p.{{.GoType.PointerMethod}}()
182 if {{template "IsZero" .}} {
183 return b, nil
184 }
Joe Tsaicd108d02020-02-14 18:08:02 -0800185 b = protowire.AppendVarint(b, f.wiretag)
Damien Neilc37adef2019-04-01 13:49:56 -0700186 {{template "Append" .}}
187 return b, nil
188}
189
Damien Neil8003f082019-08-02 15:13:00 -0700190{{if .ToGoTypeNoZero}}
191// consume{{.Name}}NoZero wire decodes a {{.GoType}} pointer as a {{.Name}}.
192// The zero value is not decoded.
Joe Tsaicd108d02020-02-14 18:08:02 -0800193func consume{{.Name}}NoZero(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
Damien Neil8003f082019-08-02 15:13:00 -0700194 if wtyp != {{.WireType.Expr}} {
Damien Neilf0831e82020-01-21 14:25:12 -0800195 return out, errUnknown
Damien Neil8003f082019-08-02 15:13:00 -0700196 }
Damien Neiladbbc8e2020-01-24 17:01:14 -0800197 {{template "Consume" .}}
Damien Neil8003f082019-08-02 15:13:00 -0700198 if n < 0 {
Joe Tsaicd108d02020-02-14 18:08:02 -0800199 return out, protowire.ParseError(n)
Damien Neil8003f082019-08-02 15:13:00 -0700200 }
201 *p.{{.GoType.PointerMethod}}() = {{.ToGoTypeNoZero}}
Damien Neilf0831e82020-01-21 14:25:12 -0800202 out.n = n
203 return out, nil
Damien Neil8003f082019-08-02 15:13:00 -0700204}
205{{end}}
206
Damien Neilc37adef2019-04-01 13:49:56 -0700207var coder{{.Name}}NoZero = pointerCoderFuncs{
Damien Neile91877d2019-06-27 10:54:42 -0700208 size: size{{.Name}}NoZero,
209 marshal: append{{.Name}}NoZero,
Damien Neil8003f082019-08-02 15:13:00 -0700210 unmarshal: consume{{.Name}}{{if .ToGoTypeNoZero}}NoZero{{end}},
Damien Neile8e88752020-02-11 11:25:16 -0800211 merge: merge{{.GoType.PointerMethod}}NoZero,
Damien Neilc37adef2019-04-01 13:49:56 -0700212}
213
Joe Tsaic51e2e02019-07-13 00:44:41 -0700214{{if or (eq .Name "Bytes") (eq .Name "String")}}
215// append{{.Name}}NoZeroValidateUTF8 wire encodes a {{.GoType}} pointer as a {{.Name}}.
216// The zero value is not encoded.
Damien Neil316febd2020-02-09 12:26:50 -0800217func append{{.Name}}NoZeroValidateUTF8(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
Joe Tsaic51e2e02019-07-13 00:44:41 -0700218 v := *p.{{.GoType.PointerMethod}}()
219 if {{template "IsZero" .}} {
220 return b, nil
221 }
Joe Tsaicd108d02020-02-14 18:08:02 -0800222 b = protowire.AppendVarint(b, f.wiretag)
Joe Tsaic51e2e02019-07-13 00:44:41 -0700223 {{template "Append" .}}
224 if !utf8.Valid{{if eq .Name "String"}}String{{end}}(v) {
225 return b, errInvalidUTF8{}
226 }
227 return b, nil
228}
229
Damien Neil8003f082019-08-02 15:13:00 -0700230{{if .ToGoTypeNoZero}}
231// consume{{.Name}}NoZeroValidateUTF8 wire decodes a {{.GoType}} pointer as a {{.Name}}.
Joe Tsaicd108d02020-02-14 18:08:02 -0800232func consume{{.Name}}NoZeroValidateUTF8(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
Damien Neil8003f082019-08-02 15:13:00 -0700233 if wtyp != {{.WireType.Expr}} {
Damien Neilf0831e82020-01-21 14:25:12 -0800234 return out, errUnknown
Damien Neil8003f082019-08-02 15:13:00 -0700235 }
Damien Neiladbbc8e2020-01-24 17:01:14 -0800236 {{template "Consume" .}}
Damien Neil8003f082019-08-02 15:13:00 -0700237 if n < 0 {
Joe Tsaicd108d02020-02-14 18:08:02 -0800238 return out, protowire.ParseError(n)
Damien Neil8003f082019-08-02 15:13:00 -0700239 }
240 if !utf8.Valid{{if eq .Name "String"}}String{{end}}(v) {
Damien Neilf0831e82020-01-21 14:25:12 -0800241 return out, errInvalidUTF8{}
Damien Neil8003f082019-08-02 15:13:00 -0700242 }
243 *p.{{.GoType.PointerMethod}}() = {{.ToGoTypeNoZero}}
Damien Neilf0831e82020-01-21 14:25:12 -0800244 out.n = n
245 return out, nil
Damien Neil8003f082019-08-02 15:13:00 -0700246}
247{{end}}
248
Joe Tsaic51e2e02019-07-13 00:44:41 -0700249var coder{{.Name}}NoZeroValidateUTF8 = pointerCoderFuncs{
250 size: size{{.Name}}NoZero,
251 marshal: append{{.Name}}NoZeroValidateUTF8,
Damien Neil8003f082019-08-02 15:13:00 -0700252 unmarshal: consume{{.Name}}{{if .ToGoTypeNoZero}}NoZero{{end}}ValidateUTF8,
Damien Neile8e88752020-02-11 11:25:16 -0800253 merge: merge{{.GoType.PointerMethod}}NoZero,
Joe Tsaic51e2e02019-07-13 00:44:41 -0700254}
255{{end}}
256
Damien Neilc37adef2019-04-01 13:49:56 -0700257{{- if not .NoPointer}}
258// size{{.Name}}Ptr returns the size of wire encoding a *{{.GoType}} pointer as a {{.Name}}.
259// It panics if the pointer is nil.
Damien Neil316febd2020-02-09 12:26:50 -0800260func size{{.Name}}Ptr(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
Damien Neilc37adef2019-04-01 13:49:56 -0700261 {{if not .WireType.ConstSize -}}
262 v := **p.{{.GoType.PointerMethod}}Ptr()
263 {{end -}}
Damien Neil316febd2020-02-09 12:26:50 -0800264 return f.tagsize + {{template "Size" .}}
Damien Neilc37adef2019-04-01 13:49:56 -0700265}
266
Damien Neile91877d2019-06-27 10:54:42 -0700267// append{{.Name}}Ptr wire encodes a *{{.GoType}} pointer as a {{.Name}}.
Damien Neilc37adef2019-04-01 13:49:56 -0700268// It panics if the pointer is nil.
Damien Neil316febd2020-02-09 12:26:50 -0800269func append{{.Name}}Ptr(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
Damien Neilc37adef2019-04-01 13:49:56 -0700270 v := **p.{{.GoType.PointerMethod}}Ptr()
Joe Tsaicd108d02020-02-14 18:08:02 -0800271 b = protowire.AppendVarint(b, f.wiretag)
Damien Neilc37adef2019-04-01 13:49:56 -0700272 {{template "Append" .}}
273 return b, nil
274}
275
Damien Neile91877d2019-06-27 10:54:42 -0700276// consume{{.Name}}Ptr wire decodes a *{{.GoType}} pointer as a {{.Name}}.
Joe Tsaicd108d02020-02-14 18:08:02 -0800277func consume{{.Name}}Ptr(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
Damien Neile91877d2019-06-27 10:54:42 -0700278 if wtyp != {{.WireType.Expr}} {
Damien Neilf0831e82020-01-21 14:25:12 -0800279 return out, errUnknown
Damien Neile91877d2019-06-27 10:54:42 -0700280 }
Damien Neiladbbc8e2020-01-24 17:01:14 -0800281 {{template "Consume" .}}
Damien Neile91877d2019-06-27 10:54:42 -0700282 if n < 0 {
Joe Tsaicd108d02020-02-14 18:08:02 -0800283 return out, protowire.ParseError(n)
Damien Neile91877d2019-06-27 10:54:42 -0700284 }
285 vp := p.{{.GoType.PointerMethod}}Ptr()
286 if *vp == nil {
287 *vp = new({{.GoType}})
288 }
289 **vp = {{.ToGoType}}
Damien Neilf0831e82020-01-21 14:25:12 -0800290 out.n = n
291 return out, nil
Damien Neile91877d2019-06-27 10:54:42 -0700292}
293
Damien Neilc37adef2019-04-01 13:49:56 -0700294var coder{{.Name}}Ptr = pointerCoderFuncs{
Damien Neile91877d2019-06-27 10:54:42 -0700295 size: size{{.Name}}Ptr,
296 marshal: append{{.Name}}Ptr,
297 unmarshal: consume{{.Name}}Ptr,
Damien Neile8e88752020-02-11 11:25:16 -0800298 merge: merge{{.GoType.PointerMethod}}Ptr,
Damien Neilc37adef2019-04-01 13:49:56 -0700299}
300{{end}}
301
Joe Tsaid0a499b2020-04-30 17:45:48 -0700302{{if (eq .Name "String")}}
303// append{{.Name}}PtrValidateUTF8 wire encodes a *{{.GoType}} pointer as a {{.Name}}.
304// It panics if the pointer is nil.
305func append{{.Name}}PtrValidateUTF8(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
306 v := **p.{{.GoType.PointerMethod}}Ptr()
307 b = protowire.AppendVarint(b, f.wiretag)
308 {{template "Append" .}}
309 if !utf8.Valid{{if eq .Name "String"}}String{{end}}(v) {
310 return b, errInvalidUTF8{}
311 }
312 return b, nil
313}
314
315// consume{{.Name}}PtrValidateUTF8 wire decodes a *{{.GoType}} pointer as a {{.Name}}.
316func consume{{.Name}}PtrValidateUTF8(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
317 if wtyp != {{.WireType.Expr}} {
318 return out, errUnknown
319 }
320 {{template "Consume" .}}
321 if n < 0 {
322 return out, protowire.ParseError(n)
323 }
324 if !utf8.Valid{{if eq .Name "String"}}String{{end}}(v) {
325 return out, errInvalidUTF8{}
326 }
327 vp := p.{{.GoType.PointerMethod}}Ptr()
328 if *vp == nil {
329 *vp = new({{.GoType}})
330 }
331 **vp = {{.ToGoType}}
332 out.n = n
333 return out, nil
334}
335
336var coder{{.Name}}PtrValidateUTF8 = pointerCoderFuncs{
337 size: size{{.Name}}Ptr,
338 marshal: append{{.Name}}PtrValidateUTF8,
339 unmarshal: consume{{.Name}}PtrValidateUTF8,
340 merge: merge{{.GoType.PointerMethod}}Ptr,
341}
342{{end}}
343
Damien Neilc37adef2019-04-01 13:49:56 -0700344// size{{.Name}}Slice returns the size of wire encoding a []{{.GoType}} pointer as a repeated {{.Name}}.
Damien Neil316febd2020-02-09 12:26:50 -0800345func size{{.Name}}Slice(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
Damien Neilc37adef2019-04-01 13:49:56 -0700346 s := *p.{{.GoType.PointerMethod}}Slice()
347 {{if .WireType.ConstSize -}}
Damien Neil316febd2020-02-09 12:26:50 -0800348 size = len(s) * (f.tagsize + {{template "Size" .}})
Damien Neilc37adef2019-04-01 13:49:56 -0700349 {{- else -}}
350 for _, v := range s {
Damien Neil316febd2020-02-09 12:26:50 -0800351 size += f.tagsize + {{template "Size" .}}
Damien Neilc37adef2019-04-01 13:49:56 -0700352 }
353 {{- end}}
354 return size
355}
356
357// append{{.Name}}Slice encodes a []{{.GoType}} pointer as a repeated {{.Name}}.
Damien Neil316febd2020-02-09 12:26:50 -0800358func append{{.Name}}Slice(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
Damien Neilc37adef2019-04-01 13:49:56 -0700359 s := *p.{{.GoType.PointerMethod}}Slice()
360 for _, v := range s {
Joe Tsaicd108d02020-02-14 18:08:02 -0800361 b = protowire.AppendVarint(b, f.wiretag)
Damien Neilc37adef2019-04-01 13:49:56 -0700362 {{template "Append" .}}
363 }
364 return b, nil
365}
366
Damien Neile91877d2019-06-27 10:54:42 -0700367// consume{{.Name}}Slice wire decodes a []{{.GoType}} pointer as a repeated {{.Name}}.
Joe Tsaicd108d02020-02-14 18:08:02 -0800368func consume{{.Name}}Slice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
Damien Neile91877d2019-06-27 10:54:42 -0700369 sp := p.{{.GoType.PointerMethod}}Slice()
370 {{- if .WireType.Packable}}
Joe Tsaicd108d02020-02-14 18:08:02 -0800371 if wtyp == protowire.BytesType {
Damien Neile91877d2019-06-27 10:54:42 -0700372 s := *sp
Joe Tsaicd108d02020-02-14 18:08:02 -0800373 b, n := protowire.ConsumeBytes(b)
Damien Neile91877d2019-06-27 10:54:42 -0700374 if n < 0 {
Joe Tsaicd108d02020-02-14 18:08:02 -0800375 return out, protowire.ParseError(n)
Damien Neile91877d2019-06-27 10:54:42 -0700376 }
377 for len(b) > 0 {
Damien Neiladbbc8e2020-01-24 17:01:14 -0800378 {{template "Consume" .}}
Damien Neile91877d2019-06-27 10:54:42 -0700379 if n < 0 {
Joe Tsaicd108d02020-02-14 18:08:02 -0800380 return out, protowire.ParseError(n)
Damien Neile91877d2019-06-27 10:54:42 -0700381 }
382 s = append(s, {{.ToGoType}})
383 b = b[n:]
384 }
385 *sp = s
Damien Neilf0831e82020-01-21 14:25:12 -0800386 out.n = n
387 return out, nil
Damien Neile91877d2019-06-27 10:54:42 -0700388 }
389 {{- end}}
390 if wtyp != {{.WireType.Expr}} {
Damien Neilf0831e82020-01-21 14:25:12 -0800391 return out, errUnknown
Damien Neile91877d2019-06-27 10:54:42 -0700392 }
Damien Neiladbbc8e2020-01-24 17:01:14 -0800393 {{template "Consume" .}}
Damien Neile91877d2019-06-27 10:54:42 -0700394 if n < 0 {
Joe Tsaicd108d02020-02-14 18:08:02 -0800395 return out, protowire.ParseError(n)
Damien Neile91877d2019-06-27 10:54:42 -0700396 }
397 *sp = append(*sp, {{.ToGoType}})
Damien Neilf0831e82020-01-21 14:25:12 -0800398 out.n = n
399 return out, nil
Damien Neile91877d2019-06-27 10:54:42 -0700400}
401
Damien Neilc37adef2019-04-01 13:49:56 -0700402var coder{{.Name}}Slice = pointerCoderFuncs{
Damien Neile91877d2019-06-27 10:54:42 -0700403 size: size{{.Name}}Slice,
404 marshal: append{{.Name}}Slice,
405 unmarshal: consume{{.Name}}Slice,
Damien Neile8e88752020-02-11 11:25:16 -0800406 merge: merge{{.GoType.PointerMethod}}Slice,
Damien Neilc37adef2019-04-01 13:49:56 -0700407}
408
Joe Tsaic51e2e02019-07-13 00:44:41 -0700409{{if or (eq .Name "Bytes") (eq .Name "String")}}
410// append{{.Name}}SliceValidateUTF8 encodes a []{{.GoType}} pointer as a repeated {{.Name}}.
Damien Neil316febd2020-02-09 12:26:50 -0800411func append{{.Name}}SliceValidateUTF8(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
Joe Tsaic51e2e02019-07-13 00:44:41 -0700412 s := *p.{{.GoType.PointerMethod}}Slice()
413 for _, v := range s {
Joe Tsaicd108d02020-02-14 18:08:02 -0800414 b = protowire.AppendVarint(b, f.wiretag)
Joe Tsaic51e2e02019-07-13 00:44:41 -0700415 {{template "Append" .}}
416 if !utf8.Valid{{if eq .Name "String"}}String{{end}}(v) {
417 return b, errInvalidUTF8{}
418 }
419 }
420 return b, nil
421}
422
423// consume{{.Name}}SliceValidateUTF8 wire decodes a []{{.GoType}} pointer as a repeated {{.Name}}.
Joe Tsaicd108d02020-02-14 18:08:02 -0800424func consume{{.Name}}SliceValidateUTF8(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
Joe Tsaic51e2e02019-07-13 00:44:41 -0700425 sp := p.{{.GoType.PointerMethod}}Slice()
426 if wtyp != {{.WireType.Expr}} {
Damien Neilf0831e82020-01-21 14:25:12 -0800427 return out, errUnknown
Joe Tsaic51e2e02019-07-13 00:44:41 -0700428 }
Damien Neiladbbc8e2020-01-24 17:01:14 -0800429 {{template "Consume" .}}
Joe Tsaic51e2e02019-07-13 00:44:41 -0700430 if n < 0 {
Joe Tsaicd108d02020-02-14 18:08:02 -0800431 return out, protowire.ParseError(n)
Joe Tsaic51e2e02019-07-13 00:44:41 -0700432 }
433 if !utf8.Valid{{if eq .Name "String"}}String{{end}}(v) {
Damien Neilf0831e82020-01-21 14:25:12 -0800434 return out, errInvalidUTF8{}
Joe Tsaic51e2e02019-07-13 00:44:41 -0700435 }
436 *sp = append(*sp, {{.ToGoType}})
Damien Neilf0831e82020-01-21 14:25:12 -0800437 out.n = n
438 return out, nil
Joe Tsaic51e2e02019-07-13 00:44:41 -0700439}
440
441var coder{{.Name}}SliceValidateUTF8 = pointerCoderFuncs{
442 size: size{{.Name}}Slice,
443 marshal: append{{.Name}}SliceValidateUTF8,
444 unmarshal: consume{{.Name}}SliceValidateUTF8,
Damien Neile8e88752020-02-11 11:25:16 -0800445 merge: merge{{.GoType.PointerMethod}}Slice,
Joe Tsaic51e2e02019-07-13 00:44:41 -0700446}
447{{end}}
448
Damien Neilc37adef2019-04-01 13:49:56 -0700449{{if or (eq .WireType "Varint") (eq .WireType "Fixed32") (eq .WireType "Fixed64")}}
450// size{{.Name}}PackedSlice returns the size of wire encoding a []{{.GoType}} pointer as a packed repeated {{.Name}}.
Damien Neil316febd2020-02-09 12:26:50 -0800451func size{{.Name}}PackedSlice(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
Damien Neilc37adef2019-04-01 13:49:56 -0700452 s := *p.{{.GoType.PointerMethod}}Slice()
453 if len(s) == 0 {
454 return 0
455 }
456 {{if .WireType.ConstSize -}}
457 n := len(s) * {{template "Size" .}}
458 {{- else -}}
459 n := 0
460 for _, v := range s {
461 n += {{template "Size" .}}
462 }
463 {{- end}}
Joe Tsaicd108d02020-02-14 18:08:02 -0800464 return f.tagsize + protowire.SizeBytes(n)
Damien Neilc37adef2019-04-01 13:49:56 -0700465}
466
467// append{{.Name}}PackedSlice encodes a []{{.GoType}} pointer as a packed repeated {{.Name}}.
Damien Neil316febd2020-02-09 12:26:50 -0800468func append{{.Name}}PackedSlice(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
Damien Neilc37adef2019-04-01 13:49:56 -0700469 s := *p.{{.GoType.PointerMethod}}Slice()
470 if len(s) == 0 {
471 return b, nil
472 }
Joe Tsaicd108d02020-02-14 18:08:02 -0800473 b = protowire.AppendVarint(b, f.wiretag)
Damien Neilc37adef2019-04-01 13:49:56 -0700474 {{if .WireType.ConstSize -}}
475 n := len(s) * {{template "Size" .}}
476 {{- else -}}
477 n := 0
478 for _, v := range s {
479 n += {{template "Size" .}}
480 }
481 {{- end}}
Joe Tsaicd108d02020-02-14 18:08:02 -0800482 b = protowire.AppendVarint(b, uint64(n))
Damien Neilc37adef2019-04-01 13:49:56 -0700483 for _, v := range s {
484 {{template "Append" .}}
485 }
486 return b, nil
487}
488
489var coder{{.Name}}PackedSlice = pointerCoderFuncs{
Damien Neile91877d2019-06-27 10:54:42 -0700490 size: size{{.Name}}PackedSlice,
491 marshal: append{{.Name}}PackedSlice,
492 unmarshal: consume{{.Name}}Slice,
Damien Neile8e88752020-02-11 11:25:16 -0800493 merge: merge{{.GoType.PointerMethod}}Slice,
Damien Neilc37adef2019-04-01 13:49:56 -0700494}
495{{end}}
496
Damien Neil68b81c32019-08-22 11:41:32 -0700497{{end -}}
498
499{{- if not .NoValueCodec}}
500// size{{.Name}}Value returns the size of wire encoding a {{.GoType}} value as a {{.Name}}.
501func size{{.Name}}Value(v protoreflect.Value, tagsize int, _ marshalOptions) int {
502 return tagsize + {{template "SizeValue" .}}
Damien Neilc37adef2019-04-01 13:49:56 -0700503}
504
Damien Neil68b81c32019-08-22 11:41:32 -0700505// append{{.Name}}Value encodes a {{.GoType}} value as a {{.Name}}.
506func append{{.Name}}Value(b []byte, v protoreflect.Value, wiretag uint64, _ marshalOptions) ([]byte, error) {
Joe Tsaicd108d02020-02-14 18:08:02 -0800507 b = protowire.AppendVarint(b, wiretag)
Damien Neil68b81c32019-08-22 11:41:32 -0700508 {{template "AppendValue" .}}
Damien Neilc37adef2019-04-01 13:49:56 -0700509 return b, nil
510}
511
Damien Neil68b81c32019-08-22 11:41:32 -0700512// consume{{.Name}}Value decodes a {{.GoType}} value as a {{.Name}}.
Joe Tsaicd108d02020-02-14 18:08:02 -0800513func consume{{.Name}}Value(b []byte, _ protoreflect.Value, _ protowire.Number, wtyp protowire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
Damien Neile91877d2019-06-27 10:54:42 -0700514 if wtyp != {{.WireType.Expr}} {
Damien Neilf0831e82020-01-21 14:25:12 -0800515 return protoreflect.Value{}, out, errUnknown
Damien Neile91877d2019-06-27 10:54:42 -0700516 }
Damien Neiladbbc8e2020-01-24 17:01:14 -0800517 {{template "Consume" .}}
Damien Neile91877d2019-06-27 10:54:42 -0700518 if n < 0 {
Joe Tsaicd108d02020-02-14 18:08:02 -0800519 return protoreflect.Value{}, out, protowire.ParseError(n)
Damien Neile91877d2019-06-27 10:54:42 -0700520 }
Damien Neilf0831e82020-01-21 14:25:12 -0800521 out.n = n
522 return {{.ToValue}}, out, nil
Damien Neile91877d2019-06-27 10:54:42 -0700523}
524
Damien Neil68b81c32019-08-22 11:41:32 -0700525var coder{{.Name}}Value = valueCoderFuncs{
Damien Neile8e88752020-02-11 11:25:16 -0800526 size: size{{.Name}}Value,
527 marshal: append{{.Name}}Value,
Damien Neil68b81c32019-08-22 11:41:32 -0700528 unmarshal: consume{{.Name}}Value,
Damien Neile8e88752020-02-11 11:25:16 -0800529{{- if (eq .Name "Bytes")}}
530 merge: mergeBytesValue,
531{{- else}}
532 merge: mergeScalarValue,
533{{- end}}
Damien Neilc37adef2019-04-01 13:49:56 -0700534}
535
Damien Neil4b3a82f2019-09-04 19:07:00 -0700536{{if (eq .Name "String")}}
Damien Neil68b81c32019-08-22 11:41:32 -0700537// append{{.Name}}ValueValidateUTF8 encodes a {{.GoType}} value as a {{.Name}}.
538func append{{.Name}}ValueValidateUTF8(b []byte, v protoreflect.Value, wiretag uint64, _ marshalOptions) ([]byte, error) {
Joe Tsaicd108d02020-02-14 18:08:02 -0800539 b = protowire.AppendVarint(b, wiretag)
Damien Neil68b81c32019-08-22 11:41:32 -0700540 {{template "AppendValue" .}}
Damien Neil4b3a82f2019-09-04 19:07:00 -0700541 if !utf8.ValidString({{.FromValue}}) {
Joe Tsaic51e2e02019-07-13 00:44:41 -0700542 return b, errInvalidUTF8{}
543 }
544 return b, nil
545}
546
Damien Neil68b81c32019-08-22 11:41:32 -0700547// consume{{.Name}}ValueValidateUTF8 decodes a {{.GoType}} value as a {{.Name}}.
Joe Tsaicd108d02020-02-14 18:08:02 -0800548func consume{{.Name}}ValueValidateUTF8(b []byte, _ protoreflect.Value, _ protowire.Number, wtyp protowire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
Joe Tsaic51e2e02019-07-13 00:44:41 -0700549 if wtyp != {{.WireType.Expr}} {
Damien Neilf0831e82020-01-21 14:25:12 -0800550 return protoreflect.Value{}, out, errUnknown
Joe Tsaic51e2e02019-07-13 00:44:41 -0700551 }
Damien Neiladbbc8e2020-01-24 17:01:14 -0800552 {{template "Consume" .}}
Joe Tsaic51e2e02019-07-13 00:44:41 -0700553 if n < 0 {
Joe Tsaicd108d02020-02-14 18:08:02 -0800554 return protoreflect.Value{}, out, protowire.ParseError(n)
Joe Tsaic51e2e02019-07-13 00:44:41 -0700555 }
Damien Neil4b3a82f2019-09-04 19:07:00 -0700556 if !utf8.ValidString(v) {
Damien Neilf0831e82020-01-21 14:25:12 -0800557 return protoreflect.Value{}, out, errInvalidUTF8{}
Joe Tsaic51e2e02019-07-13 00:44:41 -0700558 }
Damien Neilf0831e82020-01-21 14:25:12 -0800559 out.n = n
560 return {{.ToValue}}, out, nil
Joe Tsaic51e2e02019-07-13 00:44:41 -0700561}
562
Damien Neil68b81c32019-08-22 11:41:32 -0700563var coder{{.Name}}ValueValidateUTF8 = valueCoderFuncs{
564 size: size{{.Name}}Value,
565 marshal: append{{.Name}}ValueValidateUTF8,
566 unmarshal: consume{{.Name}}ValueValidateUTF8,
Damien Neile8e88752020-02-11 11:25:16 -0800567 merge: mergeScalarValue,
Joe Tsaic51e2e02019-07-13 00:44:41 -0700568}
569{{end}}
570
Damien Neil68b81c32019-08-22 11:41:32 -0700571// size{{.Name}}SliceValue returns the size of wire encoding a []{{.GoType}} value as a repeated {{.Name}}.
572func size{{.Name}}SliceValue(listv protoreflect.Value, tagsize int, _ marshalOptions) (size int) {
573 list := listv.List()
Damien Neilc37adef2019-04-01 13:49:56 -0700574 {{if .WireType.ConstSize -}}
Damien Neil68b81c32019-08-22 11:41:32 -0700575 size = list.Len() * (tagsize + {{template "SizeValue" .}})
Damien Neilc37adef2019-04-01 13:49:56 -0700576 {{- else -}}
Damien Neil68b81c32019-08-22 11:41:32 -0700577 for i, llen := 0, list.Len(); i < llen; i++ {
578 v := list.Get(i)
579 size += tagsize + {{template "SizeValue" .}}
Damien Neilc37adef2019-04-01 13:49:56 -0700580 }
581 {{- end}}
582 return size
583}
584
Damien Neil68b81c32019-08-22 11:41:32 -0700585// append{{.Name}}SliceValue encodes a []{{.GoType}} value as a repeated {{.Name}}.
586func append{{.Name}}SliceValue(b []byte, listv protoreflect.Value, wiretag uint64, _ marshalOptions) ([]byte, error) {
587 list := listv.List()
588 for i, llen := 0, list.Len(); i < llen; i++ {
589 v := list.Get(i)
Joe Tsaicd108d02020-02-14 18:08:02 -0800590 b = protowire.AppendVarint(b, wiretag)
Damien Neil68b81c32019-08-22 11:41:32 -0700591 {{template "AppendValue" .}}
Damien Neilc37adef2019-04-01 13:49:56 -0700592 }
593 return b, nil
594}
595
Damien Neil68b81c32019-08-22 11:41:32 -0700596// consume{{.Name}}SliceValue wire decodes a []{{.GoType}} value as a repeated {{.Name}}.
Joe Tsaicd108d02020-02-14 18:08:02 -0800597func consume{{.Name}}SliceValue(b []byte, listv protoreflect.Value, _ protowire.Number, wtyp protowire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
Damien Neil68b81c32019-08-22 11:41:32 -0700598 list := listv.List()
Damien Neile91877d2019-06-27 10:54:42 -0700599 {{- if .WireType.Packable}}
Joe Tsaicd108d02020-02-14 18:08:02 -0800600 if wtyp == protowire.BytesType {
601 b, n := protowire.ConsumeBytes(b)
Damien Neile91877d2019-06-27 10:54:42 -0700602 if n < 0 {
Joe Tsaicd108d02020-02-14 18:08:02 -0800603 return protoreflect.Value{}, out, protowire.ParseError(n)
Damien Neile91877d2019-06-27 10:54:42 -0700604 }
605 for len(b) > 0 {
Damien Neiladbbc8e2020-01-24 17:01:14 -0800606 {{template "Consume" .}}
Damien Neile91877d2019-06-27 10:54:42 -0700607 if n < 0 {
Joe Tsaicd108d02020-02-14 18:08:02 -0800608 return protoreflect.Value{}, out, protowire.ParseError(n)
Damien Neile91877d2019-06-27 10:54:42 -0700609 }
Damien Neil68b81c32019-08-22 11:41:32 -0700610 list.Append({{.ToValue}})
Damien Neile91877d2019-06-27 10:54:42 -0700611 b = b[n:]
612 }
Damien Neilf0831e82020-01-21 14:25:12 -0800613 out.n = n
614 return listv, out, nil
Damien Neile91877d2019-06-27 10:54:42 -0700615 }
616 {{- end}}
617 if wtyp != {{.WireType.Expr}} {
Damien Neilf0831e82020-01-21 14:25:12 -0800618 return protoreflect.Value{}, out, errUnknown
Damien Neile91877d2019-06-27 10:54:42 -0700619 }
Damien Neiladbbc8e2020-01-24 17:01:14 -0800620 {{template "Consume" .}}
Damien Neile91877d2019-06-27 10:54:42 -0700621 if n < 0 {
Joe Tsaicd108d02020-02-14 18:08:02 -0800622 return protoreflect.Value{}, out, protowire.ParseError(n)
Damien Neile91877d2019-06-27 10:54:42 -0700623 }
Damien Neil68b81c32019-08-22 11:41:32 -0700624 list.Append({{.ToValue}})
Damien Neilf0831e82020-01-21 14:25:12 -0800625 out.n = n
626 return listv, out, nil
Damien Neile91877d2019-06-27 10:54:42 -0700627}
628
Damien Neil68b81c32019-08-22 11:41:32 -0700629var coder{{.Name}}SliceValue = valueCoderFuncs{
630 size: size{{.Name}}SliceValue,
631 marshal: append{{.Name}}SliceValue,
632 unmarshal: consume{{.Name}}SliceValue,
Damien Neile8e88752020-02-11 11:25:16 -0800633{{- if (eq .Name "Bytes")}}
634 merge: mergeBytesListValue,
635{{- else}}
636 merge: mergeListValue,
637{{- end}}
Damien Neilc37adef2019-04-01 13:49:56 -0700638}
639
Damien Neil7492a092019-07-10 15:23:29 -0700640{{if or (eq .WireType "Varint") (eq .WireType "Fixed32") (eq .WireType "Fixed64")}}
Damien Neil68b81c32019-08-22 11:41:32 -0700641// size{{.Name}}PackedSliceValue returns the size of wire encoding a []{{.GoType}} value as a packed repeated {{.Name}}.
642func size{{.Name}}PackedSliceValue(listv protoreflect.Value, tagsize int, _ marshalOptions) (size int) {
643 list := listv.List()
Damien Neil2c0824b2019-12-20 12:21:25 -0800644 llen := list.Len()
645 if llen == 0 {
646 return 0
647 }
Damien Neil7492a092019-07-10 15:23:29 -0700648 {{if .WireType.ConstSize -}}
Damien Neil2c0824b2019-12-20 12:21:25 -0800649 n := llen * {{template "SizeValue" .}}
Damien Neil7492a092019-07-10 15:23:29 -0700650 {{- else -}}
651 n := 0
Damien Neil2c0824b2019-12-20 12:21:25 -0800652 for i, llen := 0, llen; i < llen; i++ {
Damien Neil68b81c32019-08-22 11:41:32 -0700653 v := list.Get(i)
654 n += {{template "SizeValue" .}}
Damien Neil7492a092019-07-10 15:23:29 -0700655 }
656 {{- end}}
Joe Tsaicd108d02020-02-14 18:08:02 -0800657 return tagsize + protowire.SizeBytes(n)
Damien Neil7492a092019-07-10 15:23:29 -0700658}
659
Damien Neil68b81c32019-08-22 11:41:32 -0700660// append{{.Name}}PackedSliceValue encodes a []{{.GoType}} value as a packed repeated {{.Name}}.
661func append{{.Name}}PackedSliceValue(b []byte, listv protoreflect.Value, wiretag uint64, _ marshalOptions) ([]byte, error) {
662 list := listv.List()
663 llen := list.Len()
664 if llen == 0 {
Damien Neil7492a092019-07-10 15:23:29 -0700665 return b, nil
666 }
Joe Tsaicd108d02020-02-14 18:08:02 -0800667 b = protowire.AppendVarint(b, wiretag)
Damien Neil7492a092019-07-10 15:23:29 -0700668 {{if .WireType.ConstSize -}}
Damien Neil68b81c32019-08-22 11:41:32 -0700669 n := llen * {{template "SizeValue" .}}
Damien Neil7492a092019-07-10 15:23:29 -0700670 {{- else -}}
671 n := 0
Damien Neil68b81c32019-08-22 11:41:32 -0700672 for i := 0; i < llen; i++ {
673 v := list.Get(i)
674 n += {{template "SizeValue" .}}
Damien Neil7492a092019-07-10 15:23:29 -0700675 }
676 {{- end}}
Joe Tsaicd108d02020-02-14 18:08:02 -0800677 b = protowire.AppendVarint(b, uint64(n))
Damien Neil68b81c32019-08-22 11:41:32 -0700678 for i := 0; i < llen; i++ {
679 v := list.Get(i)
680 {{template "AppendValue" .}}
Damien Neil7492a092019-07-10 15:23:29 -0700681 }
682 return b, nil
683}
684
Damien Neil68b81c32019-08-22 11:41:32 -0700685var coder{{.Name}}PackedSliceValue = valueCoderFuncs{
686 size: size{{.Name}}PackedSliceValue,
687 marshal: append{{.Name}}PackedSliceValue,
688 unmarshal: consume{{.Name}}SliceValue,
Damien Neile8e88752020-02-11 11:25:16 -0800689 merge: mergeListValue,
Damien Neil7492a092019-07-10 15:23:29 -0700690}
691{{end}}
692
Damien Neil68b81c32019-08-22 11:41:32 -0700693{{- end}}{{/* if not .NoValueCodec */}}
694
Damien Neilc37adef2019-04-01 13:49:56 -0700695{{end -}}
696
Damien Neil8003f082019-08-02 15:13:00 -0700697// We append to an empty array rather than a nil []byte to get non-nil zero-length byte slices.
698var emptyBuf [0]byte
699
Joe Tsaicd108d02020-02-14 18:08:02 -0800700var wireTypes = map[protoreflect.Kind]protowire.Type{
Damien Neilc37adef2019-04-01 13:49:56 -0700701{{range . -}}
702 protoreflect.{{.Name}}Kind: {{.WireType.Expr}},
703{{end}}
704}
705`))
Joe Tsai82760ce2019-06-20 03:09:57 -0700706
707func generateImplMessage() string {
708 return mustExecute(implMessageTemplate, []string{"messageState", "messageReflectWrapper"})
709}
710
711var implMessageTemplate = template.Must(template.New("").Parse(`
712{{range . -}}
713func (m *{{.}}) Descriptor() protoreflect.MessageDescriptor {
Damien Neil16163b42019-08-06 15:43:25 -0700714 return m.messageInfo().Desc
Joe Tsai82760ce2019-06-20 03:09:57 -0700715}
Joe Tsaid4211502019-07-02 14:58:02 -0700716func (m *{{.}}) Type() protoreflect.MessageType {
Damien Neil16163b42019-08-06 15:43:25 -0700717 return m.messageInfo()
Joe Tsaid4211502019-07-02 14:58:02 -0700718}
Joe Tsai82760ce2019-06-20 03:09:57 -0700719func (m *{{.}}) New() protoreflect.Message {
Damien Neil16163b42019-08-06 15:43:25 -0700720 return m.messageInfo().New()
Joe Tsai82760ce2019-06-20 03:09:57 -0700721}
722func (m *{{.}}) Interface() protoreflect.ProtoMessage {
723 {{if eq . "messageState" -}}
Joe Tsaifd528ff2019-09-03 16:30:39 -0700724 return m.protoUnwrap().(protoreflect.ProtoMessage)
Joe Tsai82760ce2019-06-20 03:09:57 -0700725 {{- else -}}
Joe Tsaifd528ff2019-09-03 16:30:39 -0700726 if m, ok := m.protoUnwrap().(protoreflect.ProtoMessage); ok {
Joe Tsai82760ce2019-06-20 03:09:57 -0700727 return m
728 }
729 return (*messageIfaceWrapper)(m)
730 {{- end -}}
731}
Joe Tsaifd528ff2019-09-03 16:30:39 -0700732func (m *{{.}}) protoUnwrap() interface{} {
Damien Neil16163b42019-08-06 15:43:25 -0700733 return m.pointer().AsIfaceOf(m.messageInfo().GoReflectType.Elem())
Joe Tsai82760ce2019-06-20 03:09:57 -0700734}
Joe Tsai0f81b382019-07-10 23:14:31 -0700735func (m *{{.}}) ProtoMethods() *protoiface.Methods {
Joe Tsai2aea6142019-07-31 12:27:30 -0700736 m.messageInfo().init()
737 return &m.messageInfo().methods
Joe Tsai0f81b382019-07-10 23:14:31 -0700738}
Joe Tsai82760ce2019-06-20 03:09:57 -0700739
Joe Tsaif647c822019-07-15 15:56:54 -0700740// ProtoMessageInfo is a pseudo-internal API for allowing the v1 code
741// to be able to retrieve a v2 MessageInfo struct.
742//
743// WARNING: This method is exempt from the compatibility promise and
744// may be removed in the future without warning.
745func (m *{{.}}) ProtoMessageInfo() *MessageInfo {
Joe Tsai2aea6142019-07-31 12:27:30 -0700746 return m.messageInfo()
Joe Tsaif647c822019-07-15 15:56:54 -0700747}
748
Joe Tsai82760ce2019-06-20 03:09:57 -0700749func (m *{{.}}) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) {
Joe Tsai2aea6142019-07-31 12:27:30 -0700750 m.messageInfo().init()
Joe Tsai9d637ca2019-09-18 18:08:52 -0700751 for _, ri := range m.messageInfo().rangeInfos {
752 switch ri := ri.(type) {
753 case *fieldInfo:
754 if ri.has(m.pointer()) {
755 if !f(ri.fieldDesc, ri.get(m.pointer())) {
756 return
757 }
758 }
759 case *oneofInfo:
760 if n := ri.which(m.pointer()); n > 0 {
761 fi := m.messageInfo().fields[n]
762 if !f(fi.fieldDesc, fi.get(m.pointer())) {
763 return
764 }
Joe Tsai82760ce2019-06-20 03:09:57 -0700765 }
766 }
767 }
Joe Tsai2aea6142019-07-31 12:27:30 -0700768 m.messageInfo().extensionMap(m.pointer()).Range(f)
Joe Tsai82760ce2019-06-20 03:09:57 -0700769}
770func (m *{{.}}) Has(fd protoreflect.FieldDescriptor) bool {
Joe Tsai2aea6142019-07-31 12:27:30 -0700771 m.messageInfo().init()
772 if fi, xt := m.messageInfo().checkField(fd); fi != nil {
Joe Tsai82760ce2019-06-20 03:09:57 -0700773 return fi.has(m.pointer())
774 } else {
Joe Tsai2aea6142019-07-31 12:27:30 -0700775 return m.messageInfo().extensionMap(m.pointer()).Has(xt)
Joe Tsai82760ce2019-06-20 03:09:57 -0700776 }
777}
778func (m *{{.}}) Clear(fd protoreflect.FieldDescriptor) {
Joe Tsai2aea6142019-07-31 12:27:30 -0700779 m.messageInfo().init()
780 if fi, xt := m.messageInfo().checkField(fd); fi != nil {
Joe Tsai82760ce2019-06-20 03:09:57 -0700781 fi.clear(m.pointer())
782 } else {
Joe Tsai2aea6142019-07-31 12:27:30 -0700783 m.messageInfo().extensionMap(m.pointer()).Clear(xt)
Joe Tsai82760ce2019-06-20 03:09:57 -0700784 }
785}
786func (m *{{.}}) Get(fd protoreflect.FieldDescriptor) protoreflect.Value {
Joe Tsai2aea6142019-07-31 12:27:30 -0700787 m.messageInfo().init()
788 if fi, xt := m.messageInfo().checkField(fd); fi != nil {
Joe Tsai82760ce2019-06-20 03:09:57 -0700789 return fi.get(m.pointer())
790 } else {
Joe Tsai2aea6142019-07-31 12:27:30 -0700791 return m.messageInfo().extensionMap(m.pointer()).Get(xt)
Joe Tsai82760ce2019-06-20 03:09:57 -0700792 }
793}
794func (m *{{.}}) Set(fd protoreflect.FieldDescriptor, v protoreflect.Value) {
Joe Tsai2aea6142019-07-31 12:27:30 -0700795 m.messageInfo().init()
796 if fi, xt := m.messageInfo().checkField(fd); fi != nil {
Joe Tsai82760ce2019-06-20 03:09:57 -0700797 fi.set(m.pointer(), v)
798 } else {
Joe Tsai2aea6142019-07-31 12:27:30 -0700799 m.messageInfo().extensionMap(m.pointer()).Set(xt, v)
Joe Tsai82760ce2019-06-20 03:09:57 -0700800 }
801}
802func (m *{{.}}) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value {
Joe Tsai2aea6142019-07-31 12:27:30 -0700803 m.messageInfo().init()
804 if fi, xt := m.messageInfo().checkField(fd); fi != nil {
Joe Tsai82760ce2019-06-20 03:09:57 -0700805 return fi.mutable(m.pointer())
806 } else {
Joe Tsai2aea6142019-07-31 12:27:30 -0700807 return m.messageInfo().extensionMap(m.pointer()).Mutable(xt)
Joe Tsai82760ce2019-06-20 03:09:57 -0700808 }
809}
Damien Neilf5274512019-08-05 10:48:38 -0700810func (m *{{.}}) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value {
Joe Tsai2aea6142019-07-31 12:27:30 -0700811 m.messageInfo().init()
812 if fi, xt := m.messageInfo().checkField(fd); fi != nil {
Damien Neilf5274512019-08-05 10:48:38 -0700813 return fi.newField()
Joe Tsai82760ce2019-06-20 03:09:57 -0700814 } else {
Damien Neilf5274512019-08-05 10:48:38 -0700815 return xt.New()
Joe Tsai82760ce2019-06-20 03:09:57 -0700816 }
817}
818func (m *{{.}}) WhichOneof(od protoreflect.OneofDescriptor) protoreflect.FieldDescriptor {
Joe Tsai2aea6142019-07-31 12:27:30 -0700819 m.messageInfo().init()
820 if oi := m.messageInfo().oneofs[od.Name()]; oi != nil && oi.oneofDesc == od {
Joe Tsai82760ce2019-06-20 03:09:57 -0700821 return od.Fields().ByNumber(oi.which(m.pointer()))
822 }
Joe Tsai1f5b6fe2020-04-22 21:58:56 -0700823 panic("invalid oneof descriptor " + string(od.FullName()) + " for message " + string(m.Descriptor().FullName()))
Joe Tsai82760ce2019-06-20 03:09:57 -0700824}
825func (m *{{.}}) GetUnknown() protoreflect.RawFields {
Joe Tsai2aea6142019-07-31 12:27:30 -0700826 m.messageInfo().init()
827 return m.messageInfo().getUnknown(m.pointer())
Joe Tsai82760ce2019-06-20 03:09:57 -0700828}
829func (m *{{.}}) SetUnknown(b protoreflect.RawFields) {
Joe Tsai2aea6142019-07-31 12:27:30 -0700830 m.messageInfo().init()
831 m.messageInfo().setUnknown(m.pointer(), b)
Joe Tsai82760ce2019-06-20 03:09:57 -0700832}
Damien Neil82886da2019-11-26 13:27:24 -0800833func (m *{{.}}) IsValid() bool {
Damien Neilb120a232019-12-16 13:23:25 -0800834 return !m.pointer().IsNil()
Damien Neil82886da2019-11-26 13:27:24 -0800835}
Joe Tsai82760ce2019-06-20 03:09:57 -0700836
837{{end}}
838`))
Damien Neile8e88752020-02-11 11:25:16 -0800839
840func generateImplMerge() string {
841 return mustExecute(implMergeTemplate, GoTypes)
842}
843
844var implMergeTemplate = template.Must(template.New("").Parse(`
845{{range .}}
846{{if ne . "[]byte"}}
847func merge{{.PointerMethod}}(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) {
848 *dst.{{.PointerMethod}}() = *src.{{.PointerMethod}}()
849}
850
851func merge{{.PointerMethod}}NoZero(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) {
852 v := *src.{{.PointerMethod}}()
853 if v != {{.Zero}} {
854 *dst.{{.PointerMethod}}() = v
855 }
856}
857
858func merge{{.PointerMethod}}Ptr(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) {
859 p := *src.{{.PointerMethod}}Ptr()
860 if p != nil {
861 v := *p
862 *dst.{{.PointerMethod}}Ptr() = &v
863 }
864}
865
866func merge{{.PointerMethod}}Slice(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) {
867 ds := dst.{{.PointerMethod}}Slice()
868 ss := src.{{.PointerMethod}}Slice()
869 *ds = append(*ds, *ss...)
870}
871
872{{end}}
873{{end}}
874`))