@@ -16,35 +16,41 @@ func init() {
16
16
registerValueEncoding (
17
17
datasetmd .VALUE_TYPE_STRING ,
18
18
datasetmd .ENCODING_TYPE_PLAIN ,
19
- func (w streamio.Writer ) valueEncoder { return newPlainEncoder (w ) },
20
- func (r streamio.Reader ) valueDecoder { return newPlainDecoder (r ) },
19
+ func (w streamio.Writer ) valueEncoder { return newPlainStringEncoder (w ) },
20
+ func (r streamio.Reader ) valueDecoder { return newPlainStringDecoder (r ) },
21
+ )
22
+ registerValueEncoding (
23
+ datasetmd .VALUE_TYPE_BYTE_ARRAY ,
24
+ datasetmd .ENCODING_TYPE_PLAIN ,
25
+ func (w streamio.Writer ) valueEncoder { return newPlainBytesEncoder (w ) },
26
+ func (r streamio.Reader ) valueDecoder { return newPlainBytesDecoder (r ) },
21
27
)
22
28
}
23
29
24
- // A plainEncoder encodes string values to an [streamio.Writer].
25
- type plainEncoder struct {
30
+ // A plainStringEncoder encodes string values to an [streamio.Writer].
31
+ type plainStringEncoder struct {
26
32
w streamio.Writer
27
33
}
28
34
29
- var _ valueEncoder = (* plainEncoder )(nil )
35
+ var _ valueEncoder = (* plainStringEncoder )(nil )
30
36
31
37
// newPlainEncoder creates a plainEncoder that writes encoded strings to w.
32
- func newPlainEncoder (w streamio.Writer ) * plainEncoder {
33
- return & plainEncoder {w : w }
38
+ func newPlainStringEncoder (w streamio.Writer ) * plainStringEncoder {
39
+ return & plainStringEncoder {w : w }
34
40
}
35
41
36
42
// ValueType returns [datasetmd.VALUE_TYPE_STRING].
37
- func (enc * plainEncoder ) ValueType () datasetmd.ValueType {
43
+ func (enc * plainStringEncoder ) ValueType () datasetmd.ValueType {
38
44
return datasetmd .VALUE_TYPE_STRING
39
45
}
40
46
41
47
// EncodingType returns [datasetmd.ENCODING_TYPE_PLAIN].
42
- func (enc * plainEncoder ) EncodingType () datasetmd.EncodingType {
48
+ func (enc * plainStringEncoder ) EncodingType () datasetmd.EncodingType {
43
49
return datasetmd .ENCODING_TYPE_PLAIN
44
50
}
45
51
46
52
// Encode encodes an individual string value.
47
- func (enc * plainEncoder ) Encode (v Value ) error {
53
+ func (enc * plainStringEncoder ) Encode (v Value ) error {
48
54
if v .Type () != datasetmd .VALUE_TYPE_STRING {
49
55
return fmt .Errorf ("plain: invalid value type %v" , v .Type ())
50
56
}
@@ -65,41 +71,41 @@ func (enc *plainEncoder) Encode(v Value) error {
65
71
}
66
72
67
73
// Flush implements [valueEncoder]. It is a no-op for plainEncoder.
68
- func (enc * plainEncoder ) Flush () error {
74
+ func (enc * plainStringEncoder ) Flush () error {
69
75
return nil
70
76
}
71
77
72
78
// Reset implements [valueEncoder]. It resets the encoder to write to w.
73
- func (enc * plainEncoder ) Reset (w streamio.Writer ) {
79
+ func (enc * plainStringEncoder ) Reset (w streamio.Writer ) {
74
80
enc .w = w
75
81
}
76
82
77
- // plainDecoder decodes strings from an [streamio.Reader].
78
- type plainDecoder struct {
83
+ // plainStringDecoder decodes strings from an [streamio.Reader].
84
+ type plainStringDecoder struct {
79
85
r streamio.Reader
80
86
}
81
87
82
- var _ valueDecoder = (* plainDecoder )(nil )
88
+ var _ valueDecoder = (* plainStringDecoder )(nil )
83
89
84
- // newPlainDecoder creates a plainDecoder that reads encoded strings from r.
85
- func newPlainDecoder (r streamio.Reader ) * plainDecoder {
86
- return & plainDecoder {r : r }
90
+ // newPlainStringDecoder creates a plainDecoder that reads encoded strings from r.
91
+ func newPlainStringDecoder (r streamio.Reader ) * plainStringDecoder {
92
+ return & plainStringDecoder {r : r }
87
93
}
88
94
89
- // ValueType returns [datasetmd.VALUE_TYPE_STRING ].
90
- func (dec * plainDecoder ) ValueType () datasetmd.ValueType {
95
+ // ValueType returns [datasetmd.VALUE_TYPE_BYTE_ARRAY ].
96
+ func (dec * plainStringDecoder ) ValueType () datasetmd.ValueType {
91
97
return datasetmd .VALUE_TYPE_STRING
92
98
}
93
99
94
100
// EncodingType returns [datasetmd.ENCODING_TYPE_PLAIN].
95
- func (dec * plainDecoder ) EncodingType () datasetmd.EncodingType {
101
+ func (dec * plainStringDecoder ) EncodingType () datasetmd.EncodingType {
96
102
return datasetmd .ENCODING_TYPE_PLAIN
97
103
}
98
104
99
105
// Decode decodes up to len(s) values, storing the results into s. The
100
106
// number of decoded values is returned, followed by an error (if any).
101
107
// At the end of the stream, Decode returns 0, [io.EOF].
102
- func (dec * plainDecoder ) Decode (s []Value ) (int , error ) {
108
+ func (dec * plainStringDecoder ) Decode (s []Value ) (int , error ) {
103
109
if len (s ) == 0 {
104
110
return 0 , nil
105
111
}
@@ -123,7 +129,7 @@ func (dec *plainDecoder) Decode(s []Value) (int, error) {
123
129
}
124
130
125
131
// decode decodes a string.
126
- func (dec * plainDecoder ) decode () (Value , error ) {
132
+ func (dec * plainStringDecoder ) decode () (Value , error ) {
127
133
sz , err := binary .ReadUvarint (dec .r )
128
134
if err != nil {
129
135
return StringValue ("" ), err
@@ -137,6 +143,123 @@ func (dec *plainDecoder) decode() (Value, error) {
137
143
}
138
144
139
145
// Reset implements [valueDecoder]. It resets the decoder to read from r.
140
- func (dec * plainDecoder ) Reset (r streamio.Reader ) {
146
+ func (dec * plainStringDecoder ) Reset (r streamio.Reader ) {
147
+ dec .r = r
148
+ }
149
+
150
+ // A plainBytesEncoder encodes byte array values to an [streamio.Writer].
151
+ type plainBytesEncoder struct {
152
+ w streamio.Writer
153
+ }
154
+
155
+ var _ valueEncoder = (* plainStringEncoder )(nil )
156
+
157
+ // newPlainEncoder creates a plainEncoder that writes encoded strings to w.
158
+ func newPlainBytesEncoder (w streamio.Writer ) * plainBytesEncoder {
159
+ return & plainBytesEncoder {w : w }
160
+ }
161
+
162
+ // ValueType returns [datasetmd.VALUE_TYPE_BYTE_ARRAY].
163
+ func (enc * plainBytesEncoder ) ValueType () datasetmd.ValueType {
164
+ return datasetmd .VALUE_TYPE_BYTE_ARRAY
165
+ }
166
+
167
+ // EncodingType returns [datasetmd.ENCODING_TYPE_PLAIN].
168
+ func (enc * plainBytesEncoder ) EncodingType () datasetmd.EncodingType {
169
+ return datasetmd .ENCODING_TYPE_PLAIN
170
+ }
171
+
172
+ // Encode encodes an individual string value.
173
+ func (enc * plainBytesEncoder ) Encode (v Value ) error {
174
+ if v .Type () != datasetmd .VALUE_TYPE_BYTE_ARRAY {
175
+ return fmt .Errorf ("plain: invalid value type %v" , v .Type ())
176
+ }
177
+ sv := v .ByteArray ()
178
+
179
+ if err := streamio .WriteUvarint (enc .w , uint64 (len (sv ))); err != nil {
180
+ return err
181
+ }
182
+
183
+ n , err := enc .w .Write (sv )
184
+ if n != len (sv ) {
185
+ return fmt .Errorf ("short write; expected %d bytes, wrote %d" , len (sv ), n )
186
+ }
187
+ return err
188
+ }
189
+
190
+ // Flush implements [valueEncoder]. It is a no-op for plainEncoder.
191
+ func (enc * plainBytesEncoder ) Flush () error {
192
+ return nil
193
+ }
194
+
195
+ // Reset implements [valueEncoder]. It resets the encoder to write to w.
196
+ func (enc * plainBytesEncoder ) Reset (w streamio.Writer ) {
197
+ enc .w = w
198
+ }
199
+
200
+ // plainBytesDecoder decodes byte arrays from an [streamio.Reader].
201
+ type plainBytesDecoder struct {
202
+ r streamio.Reader
203
+ }
204
+
205
+ var _ valueDecoder = (* plainBytesDecoder )(nil )
206
+
207
+ // newPlainBytesDecoder creates a plainDecoder that reads encoded strings from r.
208
+ func newPlainBytesDecoder (r streamio.Reader ) * plainBytesDecoder {
209
+ return & plainBytesDecoder {r : r }
210
+ }
211
+
212
+ // ValueType returns [datasetmd.VALUE_TYPE_BYTE_ARRAY].
213
+ func (dec * plainBytesDecoder ) ValueType () datasetmd.ValueType {
214
+ return datasetmd .VALUE_TYPE_BYTE_ARRAY
215
+ }
216
+
217
+ // EncodingType returns [datasetmd.ENCODING_TYPE_PLAIN].
218
+ func (dec * plainBytesDecoder ) EncodingType () datasetmd.EncodingType {
219
+ return datasetmd .ENCODING_TYPE_PLAIN
220
+ }
221
+
222
+ // Decode decodes up to len(s) values, storing the results into s. The
223
+ // number of decoded values is returned, followed by an error (if any).
224
+ // At the end of the stream, Decode returns 0, [io.EOF].
225
+ func (dec * plainBytesDecoder ) Decode (s []Value ) (int , error ) {
226
+ if len (s ) == 0 {
227
+ return 0 , nil
228
+ }
229
+
230
+ var err error
231
+ var v Value
232
+
233
+ for i := range s {
234
+ v , err = dec .decode ()
235
+ if errors .Is (err , io .EOF ) {
236
+ if i == 0 {
237
+ return 0 , io .EOF
238
+ }
239
+ return i , nil
240
+ } else if err != nil {
241
+ return i , err
242
+ }
243
+ s [i ] = v
244
+ }
245
+ return len (s ), nil
246
+ }
247
+
248
+ // decode decodes a string.
249
+ func (dec * plainBytesDecoder ) decode () (Value , error ) {
250
+ sz , err := binary .ReadUvarint (dec .r )
251
+ if err != nil {
252
+ return ByteArrayValue ([]byte {}), err
253
+ }
254
+
255
+ dst := make ([]byte , int (sz ))
256
+ if _ , err := io .ReadFull (dec .r , dst ); err != nil {
257
+ return ByteArrayValue ([]byte {}), err
258
+ }
259
+ return ByteArrayValue (dst ), nil
260
+ }
261
+
262
+ // Reset implements [valueDecoder]. It resets the decoder to read from r.
263
+ func (dec * plainBytesDecoder ) Reset (r streamio.Reader ) {
141
264
dec .r = r
142
265
}
0 commit comments