Skip to content

Commit 32d5b09

Browse files
xXSh4dowW4rriorXxCryptoCopter
authored andcommitted
added null support
1 parent 90ec315 commit 32d5b09

4 files changed

Lines changed: 55 additions & 0 deletions

File tree

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ developed to be used in [`dtn7-go`][dtn7-go], an implementation of the
1616
- Arrays, both of definite and indefinite length
1717
- Maps of definite length
1818
- Booleans
19+
- Null
1920
- Small and clear codebase:
2021
- Only works on streams, Go's `io.Reader` or `io.Writer`
2122
- Does *not* use reflection or make any strange assumptions

major.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ const (
2020

2121
const (
2222
IndefiniteArray byte = 0x9F
23+
Null byte = SimpleData | simpleNull
2324
BreakCode byte = 0xFF
2425
)
2526

@@ -32,6 +33,7 @@ func (f Flag) Error() string {
3233
const (
3334
FlagIndefiniteArray = Flag(iota)
3435
FlagBreakCode = Flag(iota)
36+
FlagNull = Flag(iota)
3537
)
3638

3739
func readMajorType(b byte) (major MajorType, adds byte) {
@@ -57,6 +59,9 @@ func ReadMajors(r io.Reader) (m MajorType, n uint64, err error) {
5759
case BreakCode:
5860
err = FlagBreakCode
5961

62+
case Null:
63+
err = FlagNull
64+
6065
default:
6166
var adds byte
6267
m, adds = readMajorType(b)

major_test.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package cboring
33
import (
44
"bufio"
55
"bytes"
6+
"io"
67
"reflect"
78
"testing"
89

@@ -207,3 +208,43 @@ func TestReadBigData(t *testing.T) {
207208
}
208209
})
209210
}
211+
212+
func asUntyped[T any](read func(reader io.Reader) (T, error)) func(reader io.Reader) (any, error) {
213+
return func(reader io.Reader) (any, error) {
214+
return read(reader)
215+
}
216+
}
217+
218+
func TestNull(t *testing.T) {
219+
tests := []struct {
220+
data []byte
221+
value any
222+
read func(reader io.Reader) (any, error)
223+
}{
224+
{[]byte{Null, 0xfb, 0xc0, 0x10, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66}, -4.1, asUntyped(ReadFloat64)},
225+
{[]byte{Null, 0x64, 0x74, 0x65, 0x73, 0x74}, "test", asUntyped(ReadTextString)},
226+
{[]byte{Null, SimpleData | simpleTrue}, true, asUntyped(ReadBoolean)},
227+
{[]byte{Null, 0x0a}, uint64(10), asUntyped(ReadUInt)},
228+
}
229+
230+
for _, test := range tests {
231+
// Read
232+
buff := bytes.NewBuffer(test.data)
233+
if v, err := test.read(buff); err != FlagNull {
234+
t.Fatalf("found Value %s", v)
235+
}
236+
if v, err := test.read(buff); err != nil {
237+
t.Fatal(err)
238+
} else if v != test.value {
239+
t.Fatalf("Resulting value %s not expected %s", v, test.value)
240+
}
241+
}
242+
243+
buff := &bytes.Buffer{}
244+
err := WriteNull(buff)
245+
if err != nil {
246+
t.Fatal(err)
247+
} else if buff.Len() != 1 || buff.Bytes()[0] != Null {
248+
t.Fatal("written value not null")
249+
}
250+
}

simple.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
const (
1010
simpleFalse byte = 20
1111
simpleTrue byte = 21
12+
simpleNull byte = 22
1213
)
1314

1415
// ReadBoolean reads a bool value from the Reader.
@@ -31,6 +32,8 @@ func ReadBoolean(r io.Reader) (b bool, err error) {
3132
b = false
3233
case simpleTrue:
3334
b = true
35+
case simpleNull:
36+
err = FlagNull
3437
default:
3538
err = fmt.Errorf("ReadBoolean: Unknown additional 0x%x", adds)
3639
}
@@ -86,3 +89,8 @@ func WriteFloat64(f float64, w io.Writer) (err error) {
8689
fbits := math.Float64bits(f)
8790
return WriteMajors(SimpleData, fbits, w)
8891
}
92+
93+
// WriteNull writes a null into the Writer.
94+
func WriteNull(w io.Writer) (err error) {
95+
return WriteMajors(SimpleData, uint64(simpleNull), w)
96+
}

0 commit comments

Comments
 (0)