Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

exp/lighthorizon: Add XDR marshalling for the TrieNode structure. #4375

Merged
merged 3 commits into from
May 12, 2022
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
Add trie XDR structures
  • Loading branch information
Shaptic committed May 12, 2022
commit 4091b233b44b62c3cb23f8bc3c01ada49ff34c17
16 changes: 16 additions & 0 deletions exp/lighthorizon/index/xdr/LightHorizon-types.x
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,20 @@ struct CheckpointIndex {
Value bitmap;
};

struct TrieIndex {
uint32 version;
TrieNode root;
};

struct TrieNodeChild {
opaque key[1];
TrieNode node;
};

struct TrieNode {
Value prefix;
Value value;
TrieNodeChild children<>;
};

}
237 changes: 237 additions & 0 deletions exp/lighthorizon/index/xdr/xdr_generated.go
Original file line number Diff line number Diff line change
Expand Up @@ -244,4 +244,241 @@ func (s CheckpointIndex) xdrType() {}

var _ xdrType = (*CheckpointIndex)(nil)

// TrieIndex is an XDR Struct defines as:
//
// struct TrieIndex {
// uint32 version;
// TrieNode root;
// };
//
type TrieIndex struct {
Version Uint32
Root TrieNode
}

// EncodeTo encodes this value using the Encoder.
func (s *TrieIndex) EncodeTo(e *xdr.Encoder) error {
var err error
if err = s.Version.EncodeTo(e); err != nil {
return err
}
if err = s.Root.EncodeTo(e); err != nil {
return err
}
return nil
}

var _ decoderFrom = (*TrieIndex)(nil)

// DecodeFrom decodes this value using the Decoder.
func (s *TrieIndex) DecodeFrom(d *xdr.Decoder) (int, error) {
var err error
var n, nTmp int
nTmp, err = s.Version.DecodeFrom(d)
n += nTmp
if err != nil {
return n, fmt.Errorf("decoding Uint32: %s", err)
}
nTmp, err = s.Root.DecodeFrom(d)
n += nTmp
if err != nil {
return n, fmt.Errorf("decoding TrieNode: %s", err)
}
return n, nil
}

// MarshalBinary implements encoding.BinaryMarshaler.
func (s TrieIndex) MarshalBinary() ([]byte, error) {
b := bytes.Buffer{}
e := xdr.NewEncoder(&b)
err := s.EncodeTo(e)
return b.Bytes(), err
}

// UnmarshalBinary implements encoding.BinaryUnmarshaler.
func (s *TrieIndex) UnmarshalBinary(inp []byte) error {
r := bytes.NewReader(inp)
d := xdr.NewDecoder(r)
_, err := s.DecodeFrom(d)
return err
}

var (
_ encoding.BinaryMarshaler = (*TrieIndex)(nil)
_ encoding.BinaryUnmarshaler = (*TrieIndex)(nil)
)

// xdrType signals that this type is an type representing
// representing XDR values defined by this package.
func (s TrieIndex) xdrType() {}

var _ xdrType = (*TrieIndex)(nil)

// TrieNodeChild is an XDR Struct defines as:
//
// struct TrieNodeChild {
// opaque key[1];
// TrieNode node;
// };
//
type TrieNodeChild struct {
Key [1]byte `xdrmaxsize:"1"`
Node TrieNode
}

// EncodeTo encodes this value using the Encoder.
func (s *TrieNodeChild) EncodeTo(e *xdr.Encoder) error {
var err error
if _, err = e.EncodeFixedOpaque(s.Key[:]); err != nil {
return err
}
if err = s.Node.EncodeTo(e); err != nil {
return err
}
return nil
}

var _ decoderFrom = (*TrieNodeChild)(nil)

// DecodeFrom decodes this value using the Decoder.
func (s *TrieNodeChild) DecodeFrom(d *xdr.Decoder) (int, error) {
var err error
var n, nTmp int
nTmp, err = d.DecodeFixedOpaqueInplace(s.Key[:])
n += nTmp
if err != nil {
return n, fmt.Errorf("decoding Key: %s", err)
}
nTmp, err = s.Node.DecodeFrom(d)
n += nTmp
if err != nil {
return n, fmt.Errorf("decoding TrieNode: %s", err)
}
return n, nil
}

// MarshalBinary implements encoding.BinaryMarshaler.
func (s TrieNodeChild) MarshalBinary() ([]byte, error) {
b := bytes.Buffer{}
e := xdr.NewEncoder(&b)
err := s.EncodeTo(e)
return b.Bytes(), err
}

// UnmarshalBinary implements encoding.BinaryUnmarshaler.
func (s *TrieNodeChild) UnmarshalBinary(inp []byte) error {
r := bytes.NewReader(inp)
d := xdr.NewDecoder(r)
_, err := s.DecodeFrom(d)
return err
}

var (
_ encoding.BinaryMarshaler = (*TrieNodeChild)(nil)
_ encoding.BinaryUnmarshaler = (*TrieNodeChild)(nil)
)

// xdrType signals that this type is an type representing
// representing XDR values defined by this package.
func (s TrieNodeChild) xdrType() {}

var _ xdrType = (*TrieNodeChild)(nil)

// TrieNode is an XDR Struct defines as:
//
// struct TrieNode {
// Value prefix;
// Value value;
// TrieNodeChild children<>;
// };
//
type TrieNode struct {
Prefix Value
Value Value
Children []TrieNodeChild
}

// EncodeTo encodes this value using the Encoder.
func (s *TrieNode) EncodeTo(e *xdr.Encoder) error {
var err error
if err = s.Prefix.EncodeTo(e); err != nil {
return err
}
if err = s.Value.EncodeTo(e); err != nil {
return err
}
if _, err = e.EncodeUint(uint32(len(s.Children))); err != nil {
return err
}
for i := 0; i < len(s.Children); i++ {
if err = s.Children[i].EncodeTo(e); err != nil {
return err
}
}
return nil
}

var _ decoderFrom = (*TrieNode)(nil)

// DecodeFrom decodes this value using the Decoder.
func (s *TrieNode) DecodeFrom(d *xdr.Decoder) (int, error) {
var err error
var n, nTmp int
nTmp, err = s.Prefix.DecodeFrom(d)
n += nTmp
if err != nil {
return n, fmt.Errorf("decoding Value: %s", err)
}
nTmp, err = s.Value.DecodeFrom(d)
n += nTmp
if err != nil {
return n, fmt.Errorf("decoding Value: %s", err)
}
var l uint32
l, nTmp, err = d.DecodeUint()
n += nTmp
if err != nil {
return n, fmt.Errorf("decoding TrieNodeChild: %s", err)
}
s.Children = nil
if l > 0 {
s.Children = make([]TrieNodeChild, l)
for i := uint32(0); i < l; i++ {
nTmp, err = s.Children[i].DecodeFrom(d)
n += nTmp
if err != nil {
return n, fmt.Errorf("decoding TrieNodeChild: %s", err)
}
}
}
return n, nil
}

// MarshalBinary implements encoding.BinaryMarshaler.
func (s TrieNode) MarshalBinary() ([]byte, error) {
b := bytes.Buffer{}
e := xdr.NewEncoder(&b)
err := s.EncodeTo(e)
return b.Bytes(), err
}

// UnmarshalBinary implements encoding.BinaryUnmarshaler.
func (s *TrieNode) UnmarshalBinary(inp []byte) error {
r := bytes.NewReader(inp)
d := xdr.NewDecoder(r)
_, err := s.DecodeFrom(d)
return err
}

var (
_ encoding.BinaryMarshaler = (*TrieNode)(nil)
_ encoding.BinaryUnmarshaler = (*TrieNode)(nil)
)

// xdrType signals that this type is an type representing
// representing XDR values defined by this package.
func (s TrieNode) xdrType() {}

var _ xdrType = (*TrieNode)(nil)

var fmtTest = fmt.Sprint("this is a dummy usage of fmt")