Skip to content

Commit f911c55

Browse files
committed
feat: cbor encoding of all referenced param & return types
Closes: #396
1 parent 3cfb1b4 commit f911c55

File tree

32 files changed

+2401
-25
lines changed

32 files changed

+2401
-25
lines changed

abi/cbor_test.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,45 @@ func TestCborBytesTransparent(t *testing.T) {
2222
require.NoError(t, bytesDeSer.UnmarshalCBOR(bytes.NewReader(tBytes)))
2323
require.Equal(t, tBytes, bytesDeSer)
2424
}
25+
26+
func TestCborSectorSize(t *testing.T) {
27+
tSectorSize := abi.SectorSize(20 * 1024)
28+
29+
buf := new(bytes.Buffer)
30+
require.NoError(t, tSectorSize.MarshalCBOR(buf))
31+
32+
sectorSizeSer := buf.Bytes()
33+
t.Logf("Serialized SectorSize: %x", sectorSizeSer)
34+
35+
var sectorSizeDeSer abi.SectorSize
36+
require.NoError(t, sectorSizeDeSer.UnmarshalCBOR(bytes.NewReader(sectorSizeSer)))
37+
require.Equal(t, tSectorSize, sectorSizeDeSer)
38+
39+
var nullSectorSize *abi.SectorSize
40+
buf = new(bytes.Buffer)
41+
require.NoError(t, nullSectorSize.MarshalCBOR(buf))
42+
require.Equal(t, []byte{0xf6}, buf.Bytes(), "null SectorSize should serialize to CBOR null")
43+
require.NoError(t, nullSectorSize.UnmarshalCBOR(bytes.NewReader([]byte{0xf6})))
44+
require.Nil(t, nullSectorSize, "unmarshaled null SectorSize should be nil")
45+
}
46+
47+
func TestCborSectorNumber(t *testing.T) {
48+
tSectorNumber := abi.SectorNumber(42)
49+
50+
buf := new(bytes.Buffer)
51+
require.NoError(t, tSectorNumber.MarshalCBOR(buf))
52+
53+
sectorNumberSer := buf.Bytes()
54+
t.Logf("Serialized SectorNumber: %x", sectorNumberSer)
55+
56+
var sectorNumberDeSer abi.SectorNumber
57+
require.NoError(t, sectorNumberDeSer.UnmarshalCBOR(bytes.NewReader(sectorNumberSer)))
58+
require.Equal(t, tSectorNumber, sectorNumberDeSer)
59+
60+
var nullSectorNumber *abi.SectorNumber
61+
buf = new(bytes.Buffer)
62+
require.NoError(t, nullSectorNumber.MarshalCBOR(buf))
63+
require.Equal(t, []byte{0xf6}, buf.Bytes(), "null SectorNumber should serialize to CBOR null")
64+
require.NoError(t, nullSectorNumber.UnmarshalCBOR(bytes.NewReader([]byte{0xf6})))
65+
require.Nil(t, nullSectorNumber, "unmarshaled null SectorNumber should be nil")
66+
}

abi/cbor_uint_types.go

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
package abi
2+
3+
import (
4+
"fmt"
5+
"io"
6+
7+
cbg "github.com/whyrusleeping/cbor-gen"
8+
)
9+
10+
// marshalNullableUint64 is a helper for marshaling nullable uint64 types
11+
func marshalNullableUint64(w io.Writer, v *uint64) error {
12+
if v == nil {
13+
_, err := w.Write(cbg.CborNull)
14+
return err
15+
}
16+
17+
if err := cbg.WriteMajorTypeHeader(w, cbg.MajUnsignedInt, *v); err != nil {
18+
return err
19+
}
20+
return nil
21+
}
22+
23+
// unmarshalNullableUint64 is a helper for unmarshaling nullable uint64 types
24+
func unmarshalNullableUint64(r io.Reader, v *uint64, typeName string) error {
25+
cr := cbg.NewCborReader(r)
26+
b, err := cr.ReadByte()
27+
if err != nil {
28+
return fmt.Errorf("failed to read byte for %s: %w", typeName, err)
29+
}
30+
if b == cbg.CborNull[0] {
31+
// Null value - don't modify v as it might be nil
32+
// Just return as we've successfully read a null
33+
return nil
34+
}
35+
36+
cr.UnreadByte()
37+
maj, extra, err := cbg.CborReadHeader(cr)
38+
if err != nil {
39+
return fmt.Errorf("failed to parse CBOR header for %s: %w", typeName, err)
40+
}
41+
42+
if maj != cbg.MajUnsignedInt {
43+
return fmt.Errorf("wrong type for %s field: %d", typeName, maj)
44+
}
45+
46+
*v = extra
47+
return nil
48+
}
49+
50+
func (t *SectorSize) MarshalCBOR(w io.Writer) error {
51+
if t == nil {
52+
_, err := w.Write(cbg.CborNull)
53+
return err
54+
}
55+
return marshalNullableUint64(w, (*uint64)(t))
56+
}
57+
58+
func (t *SectorSize) UnmarshalCBOR(r io.Reader) error {
59+
if t == nil {
60+
// Just consume the value without storing it
61+
var dummy uint64
62+
return unmarshalNullableUint64(r, &dummy, "SectorSize")
63+
}
64+
65+
value := uint64(*t)
66+
if err := unmarshalNullableUint64(r, &value, "SectorSize"); err != nil {
67+
return err
68+
}
69+
*t = SectorSize(value)
70+
return nil
71+
}
72+
73+
func (t *SectorNumber) MarshalCBOR(w io.Writer) error {
74+
if t == nil {
75+
_, err := w.Write(cbg.CborNull)
76+
return err
77+
}
78+
return marshalNullableUint64(w, (*uint64)(t))
79+
}
80+
81+
func (t *SectorNumber) UnmarshalCBOR(r io.Reader) error {
82+
if t == nil {
83+
// Just consume the value without storing it
84+
var dummy uint64
85+
return unmarshalNullableUint64(r, &dummy, "SectorNumber")
86+
}
87+
88+
value := uint64(*t)
89+
if err := unmarshalNullableUint64(r, &value, "SectorNumber"); err != nil {
90+
return err
91+
}
92+
*t = SectorNumber(value)
93+
return nil
94+
}

builtin/v10/cron/cbor_gen.go

Lines changed: 95 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

builtin/v10/gen/gen.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ func main() {
4141
cron.State{},
4242
cron.Entry{},
4343
// method params and returns
44+
cron.ConstructorParams{},
4445
); err != nil {
4546
panic(err)
4647
}

builtin/v11/cron/cbor_gen.go

Lines changed: 95 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

builtin/v11/gen/gen.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ func main() {
4141
cron.State{},
4242
cron.Entry{},
4343
// method params and returns
44+
cron.ConstructorParams{},
4445
); err != nil {
4546
panic(err)
4647
}

0 commit comments

Comments
 (0)