blob: 32111b7f41d7933d311e9089a1bcf737003bf73e [file] [log] [blame]
David K. Bainbridge215e0242017-09-05 23:18:24 -07001// Protocol Buffers for Go with Gadgets
2//
3// Copyright (c) 2013, The GoGo Authors. All rights reserved.
4// http://github.com/gogo/protobuf
5//
6// Go support for Protocol Buffers - Google's data interchange format
7//
8// Copyright 2010 The Go Authors. All rights reserved.
9// http://github.com/golang/protobuf/
10//
11// Redistribution and use in source and binary forms, with or without
12// modification, are permitted provided that the following conditions are
13// met:
14//
15// * Redistributions of source code must retain the above copyright
16// notice, this list of conditions and the following disclaimer.
17// * Redistributions in binary form must reproduce the above
18// copyright notice, this list of conditions and the following disclaimer
19// in the documentation and/or other materials provided with the
20// distribution.
21// * Neither the name of Google Inc. nor the names of its
22// contributors may be used to endorse or promote products derived from
23// this software without specific prior written permission.
24//
25// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36
37package proto
38
39import (
40 "reflect"
41)
42
43func NewRequiredNotSetError(field string) *RequiredNotSetError {
44 return &RequiredNotSetError{field}
45}
46
47type Sizer interface {
48 Size() int
49}
50
51func (o *Buffer) enc_ext_slice_byte(p *Properties, base structPointer) error {
52 s := *structPointer_Bytes(base, p.field)
53 if s == nil {
54 return ErrNil
55 }
56 o.buf = append(o.buf, s...)
57 return nil
58}
59
60func size_ext_slice_byte(p *Properties, base structPointer) (n int) {
61 s := *structPointer_Bytes(base, p.field)
62 if s == nil {
63 return 0
64 }
65 n += len(s)
66 return
67}
68
69// Encode a reference to bool pointer.
70func (o *Buffer) enc_ref_bool(p *Properties, base structPointer) error {
71 v := *structPointer_BoolVal(base, p.field)
72 x := 0
73 if v {
74 x = 1
75 }
76 o.buf = append(o.buf, p.tagcode...)
77 p.valEnc(o, uint64(x))
78 return nil
79}
80
81func size_ref_bool(p *Properties, base structPointer) int {
82 return len(p.tagcode) + 1 // each bool takes exactly one byte
83}
84
85// Encode a reference to int32 pointer.
86func (o *Buffer) enc_ref_int32(p *Properties, base structPointer) error {
87 v := structPointer_Word32Val(base, p.field)
88 x := int32(word32Val_Get(v))
89 o.buf = append(o.buf, p.tagcode...)
90 p.valEnc(o, uint64(x))
91 return nil
92}
93
94func size_ref_int32(p *Properties, base structPointer) (n int) {
95 v := structPointer_Word32Val(base, p.field)
96 x := int32(word32Val_Get(v))
97 n += len(p.tagcode)
98 n += p.valSize(uint64(x))
99 return
100}
101
102func (o *Buffer) enc_ref_uint32(p *Properties, base structPointer) error {
103 v := structPointer_Word32Val(base, p.field)
104 x := word32Val_Get(v)
105 o.buf = append(o.buf, p.tagcode...)
106 p.valEnc(o, uint64(x))
107 return nil
108}
109
110func size_ref_uint32(p *Properties, base structPointer) (n int) {
111 v := structPointer_Word32Val(base, p.field)
112 x := word32Val_Get(v)
113 n += len(p.tagcode)
114 n += p.valSize(uint64(x))
115 return
116}
117
118// Encode a reference to an int64 pointer.
119func (o *Buffer) enc_ref_int64(p *Properties, base structPointer) error {
120 v := structPointer_Word64Val(base, p.field)
121 x := word64Val_Get(v)
122 o.buf = append(o.buf, p.tagcode...)
123 p.valEnc(o, x)
124 return nil
125}
126
127func size_ref_int64(p *Properties, base structPointer) (n int) {
128 v := structPointer_Word64Val(base, p.field)
129 x := word64Val_Get(v)
130 n += len(p.tagcode)
131 n += p.valSize(x)
132 return
133}
134
135// Encode a reference to a string pointer.
136func (o *Buffer) enc_ref_string(p *Properties, base structPointer) error {
137 v := *structPointer_StringVal(base, p.field)
138 o.buf = append(o.buf, p.tagcode...)
139 o.EncodeStringBytes(v)
140 return nil
141}
142
143func size_ref_string(p *Properties, base structPointer) (n int) {
144 v := *structPointer_StringVal(base, p.field)
145 n += len(p.tagcode)
146 n += sizeStringBytes(v)
147 return
148}
149
150// Encode a reference to a message struct.
151func (o *Buffer) enc_ref_struct_message(p *Properties, base structPointer) error {
152 var state errorState
153 structp := structPointer_GetRefStructPointer(base, p.field)
154 if structPointer_IsNil(structp) {
155 return ErrNil
156 }
157
158 // Can the object marshal itself?
159 if p.isMarshaler {
160 m := structPointer_Interface(structp, p.stype).(Marshaler)
161 data, err := m.Marshal()
162 if err != nil && !state.shouldContinue(err, nil) {
163 return err
164 }
165 o.buf = append(o.buf, p.tagcode...)
166 o.EncodeRawBytes(data)
167 return nil
168 }
169
170 o.buf = append(o.buf, p.tagcode...)
171 return o.enc_len_struct(p.sprop, structp, &state)
172}
173
174//TODO this is only copied, please fix this
175func size_ref_struct_message(p *Properties, base structPointer) int {
176 structp := structPointer_GetRefStructPointer(base, p.field)
177 if structPointer_IsNil(structp) {
178 return 0
179 }
180
181 // Can the object marshal itself?
182 if p.isMarshaler {
183 m := structPointer_Interface(structp, p.stype).(Marshaler)
184 data, _ := m.Marshal()
185 n0 := len(p.tagcode)
186 n1 := sizeRawBytes(data)
187 return n0 + n1
188 }
189
190 n0 := len(p.tagcode)
191 n1 := size_struct(p.sprop, structp)
192 n2 := sizeVarint(uint64(n1)) // size of encoded length
193 return n0 + n1 + n2
194}
195
196// Encode a slice of references to message struct pointers ([]struct).
197func (o *Buffer) enc_slice_ref_struct_message(p *Properties, base structPointer) error {
198 var state errorState
199 ss := structPointer_StructRefSlice(base, p.field, p.stype.Size())
200 l := ss.Len()
201 for i := 0; i < l; i++ {
202 structp := ss.Index(i)
203 if structPointer_IsNil(structp) {
204 return errRepeatedHasNil
205 }
206
207 // Can the object marshal itself?
208 if p.isMarshaler {
209 m := structPointer_Interface(structp, p.stype).(Marshaler)
210 data, err := m.Marshal()
211 if err != nil && !state.shouldContinue(err, nil) {
212 return err
213 }
214 o.buf = append(o.buf, p.tagcode...)
215 o.EncodeRawBytes(data)
216 continue
217 }
218
219 o.buf = append(o.buf, p.tagcode...)
220 err := o.enc_len_struct(p.sprop, structp, &state)
221 if err != nil && !state.shouldContinue(err, nil) {
222 if err == ErrNil {
223 return errRepeatedHasNil
224 }
225 return err
226 }
227
228 }
229 return state.err
230}
231
232//TODO this is only copied, please fix this
233func size_slice_ref_struct_message(p *Properties, base structPointer) (n int) {
234 ss := structPointer_StructRefSlice(base, p.field, p.stype.Size())
235 l := ss.Len()
236 n += l * len(p.tagcode)
237 for i := 0; i < l; i++ {
238 structp := ss.Index(i)
239 if structPointer_IsNil(structp) {
240 return // return the size up to this point
241 }
242
243 // Can the object marshal itself?
244 if p.isMarshaler {
245 m := structPointer_Interface(structp, p.stype).(Marshaler)
246 data, _ := m.Marshal()
247 n += len(p.tagcode)
248 n += sizeRawBytes(data)
249 continue
250 }
251
252 n0 := size_struct(p.sprop, structp)
253 n1 := sizeVarint(uint64(n0)) // size of encoded length
254 n += n0 + n1
255 }
256 return
257}
258
259func (o *Buffer) enc_custom_bytes(p *Properties, base structPointer) error {
260 i := structPointer_InterfaceRef(base, p.field, p.ctype)
261 if i == nil {
262 return ErrNil
263 }
264 custom := i.(Marshaler)
265 data, err := custom.Marshal()
266 if err != nil {
267 return err
268 }
269 if data == nil {
270 return ErrNil
271 }
272 o.buf = append(o.buf, p.tagcode...)
273 o.EncodeRawBytes(data)
274 return nil
275}
276
277func size_custom_bytes(p *Properties, base structPointer) (n int) {
278 n += len(p.tagcode)
279 i := structPointer_InterfaceRef(base, p.field, p.ctype)
280 if i == nil {
281 return 0
282 }
283 custom := i.(Marshaler)
284 data, _ := custom.Marshal()
285 n += sizeRawBytes(data)
286 return
287}
288
289func (o *Buffer) enc_custom_ref_bytes(p *Properties, base structPointer) error {
290 custom := structPointer_InterfaceAt(base, p.field, p.ctype).(Marshaler)
291 data, err := custom.Marshal()
292 if err != nil {
293 return err
294 }
295 if data == nil {
296 return ErrNil
297 }
298 o.buf = append(o.buf, p.tagcode...)
299 o.EncodeRawBytes(data)
300 return nil
301}
302
303func size_custom_ref_bytes(p *Properties, base structPointer) (n int) {
304 n += len(p.tagcode)
305 i := structPointer_InterfaceAt(base, p.field, p.ctype)
306 if i == nil {
307 return 0
308 }
309 custom := i.(Marshaler)
310 data, _ := custom.Marshal()
311 n += sizeRawBytes(data)
312 return
313}
314
315func (o *Buffer) enc_custom_slice_bytes(p *Properties, base structPointer) error {
316 inter := structPointer_InterfaceRef(base, p.field, p.ctype)
317 if inter == nil {
318 return ErrNil
319 }
320 slice := reflect.ValueOf(inter)
321 l := slice.Len()
322 for i := 0; i < l; i++ {
323 v := slice.Index(i)
324 custom := v.Interface().(Marshaler)
325 data, err := custom.Marshal()
326 if err != nil {
327 return err
328 }
329 o.buf = append(o.buf, p.tagcode...)
330 o.EncodeRawBytes(data)
331 }
332 return nil
333}
334
335func size_custom_slice_bytes(p *Properties, base structPointer) (n int) {
336 inter := structPointer_InterfaceRef(base, p.field, p.ctype)
337 if inter == nil {
338 return 0
339 }
340 slice := reflect.ValueOf(inter)
341 l := slice.Len()
342 n += l * len(p.tagcode)
343 for i := 0; i < l; i++ {
344 v := slice.Index(i)
345 custom := v.Interface().(Marshaler)
346 data, _ := custom.Marshal()
347 n += sizeRawBytes(data)
348 }
349 return
350}