typegen

package module
v0.0.4 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 31, 2021 License: MIT Imports: 19 Imported by: 0

README

cbor-gen

Fork of cbor-gen used by BDWare projects.

Some basic utilities to generate fast path cbor codecs for your types.

New features of this fork:

  • Correctly marshal/unmarshal struct fields of slice type with nil values to/from CborNull

  • Flatten embedded anonymous struct fields

    For example, if we have the following structs:

    type FlatStruct struct {
        Foo     string
        Value   uint64
        Binary  []byte
        Signed  int64
        NString NamedString
    }  
    
    type EmbeddedStruct struct {
        Foo     string
        Value   uint64
        Binary  []byte
    }
    
    type ExplicitEmbeddingStruct struct {
        EmbeddedStruct EmbeddedStruct
        Binary  []byte
        Signed  int64
        NString NamedString
    }
    
    type ExplicitEmbeddingStruct2 struct {
        EmbeddedStruct *EmbeddedStruct
        Binary  []byte
        Signed  int64
        NString NamedString
    }
    
    type AnonymousEmbeddingStruct struct {
        EmbeddedStruct
        Binary  []byte
        Signed  int64
        NString NamedString
    }
    
    type AnonymousEmbeddingStruct2 struct {
        *EmbeddedStruct
        Binary  []byte
        Signed  int64
        NString NamedString
    }
    

    With the original cbor-gen, ExplicitEmbeddingStruct, ExplicitEmbeddingStruct2, AnonymousEmbeddingStruct and AnonymousEmbeddingStruct2 will all be serialized into the same byte sequence, which is different from that of FlatStruct.

    With this fork, AnonymousEmbeddingStruct and AnonymousEmbeddingStruct2 will be serialized into the same byte sequence as that of FlatStruct, which is different from that of ExplicitEmbeddingStruct and ExplicitEmbeddingStruct2.

    The same flattening applies to structs with arbitrary levels of anonymous embedding.

    Note: Before calling UnmarshalCBOR on an embedding struct obj, you must make sure that all anonymous structs directly and indirectly (multiple levels of embedding) embedded in obj by pointers are initialized (not null).

License

MIT

Documentation

Index

Constants

View Source
const (
	MajUnsignedInt = 0
	MajNegativeInt = 1
	MajByteString  = 2
	MajTextString  = 3
	MajArray       = 4
	MajMap         = 5
	MajTag         = 6
	MajOther       = 7
)
View Source
const ByteArrayMaxLen = 2 << 20
View Source
const MaxLength = 8192

Variables

View Source
var (
	CborBoolFalse = []byte{0xf4}
	CborBoolTrue  = []byte{0xf5}
	CborNull      = []byte{0xf6}
)

Functions

func CborEncodeMajorType

func CborEncodeMajorType(t byte, l uint64) []byte

func CborReadHeader

func CborReadHeader(br io.Reader) (byte, uint64, error)

func CborReadHeaderBuf

func CborReadHeaderBuf(br io.Reader, scratch []byte) (byte, uint64, error)

same as the above, just tries to allocate less by using a passed in scratch buffer

func CborWriteHeader

func CborWriteHeader(w io.Writer, t byte, l uint64) error

func EncodeBool

func EncodeBool(b bool) []byte

func GenMapEncodersForType

func GenMapEncodersForType(gti *GenTypeInfo, w io.Writer) error

Generates 'tuple representation' cbor encoders for the given type

func GenTupleEncodersForType

func GenTupleEncodersForType(gti *GenTypeInfo, w io.Writer) error

Generates 'tuple representation' cbor encoders for the given type

func PrintHeaderAndUtilityMethods

func PrintHeaderAndUtilityMethods(w io.Writer, pkg string, typeInfos []*GenTypeInfo) error

func ReadByteArray

func ReadByteArray(br io.Reader, maxlen uint64) ([]byte, error)

func ReadCid

func ReadCid(br io.Reader) (cid.Cid, error)

func ReadString

func ReadString(r io.Reader) (string, error)

func ReadStringBuf

func ReadStringBuf(r io.Reader, scratch []byte) (string, error)

func ReadTaggedByteArray

func ReadTaggedByteArray(br io.Reader, exptag uint64, maxlen uint64) ([]byte, error)
func ScanForLinks(br io.Reader, cb func(cid.Cid)) error

func ValidateCBOR

func ValidateCBOR(b []byte) error

ValidateCBOR validates that a byte array is a single valid CBOR object.

func WriteBool

func WriteBool(w io.Writer, b bool) error

func WriteCid

func WriteCid(w io.Writer, c cid.Cid) error

func WriteCidBuf

func WriteCidBuf(buf []byte, w io.Writer, c cid.Cid) error

func WriteMajorTypeHeader

func WriteMajorTypeHeader(w io.Writer, t byte, l uint64) error

TODO: No matter what I do, this function *still* allocates. Its super frustrating. See issue: https://github.com/golang/go/issues/33160

func WriteMajorTypeHeaderBuf

func WriteMajorTypeHeaderBuf(buf []byte, w io.Writer, t byte, l uint64) error

Same as the above, but uses a passed in buffer to avoid allocations

func WriteMapEncodersToFile

func WriteMapEncodersToFile(fname, pkg string, types ...interface{}) error

WriteMapFileEncodersToFile generates map backed MarshalCBOR and UnmarshalCBOR implementations for the given types in the specified file, with the specified package name.

The MarshalCBOR and UnmarshalCBOR implementations will marshal/unmarshal each type's fields as a map of field names to field values.

func WriteTupleEncodersToFile

func WriteTupleEncodersToFile(fname, pkg string, types ...interface{}) error

WriteTupleFileEncodersToFile generates array backed MarshalCBOR and UnmarshalCBOR implementations for the given types in the specified file, with the specified package name.

The MarshalCBOR and UnmarshalCBOR implementations will marshal/unmarshal each type's fields as a fixed-length CBOR array of field values.

Types

type BytePeeker

type BytePeeker interface {
	io.Reader
	io.ByteScanner
}

BytePeeker combines the Reader and ByteScanner interfaces.

func GetPeeker

func GetPeeker(r io.Reader) BytePeeker

type CBORMarshaler

type CBORMarshaler interface {
	MarshalCBOR(io.Writer) error
}

type CBORUnmarshaler

type CBORUnmarshaler interface {
	UnmarshalCBOR(io.Reader) error
}

type CborBool

type CborBool bool

func (*CborBool) MarshalCBOR

func (cb *CborBool) MarshalCBOR(w io.Writer) error

func (*CborBool) UnmarshalCBOR

func (cb *CborBool) UnmarshalCBOR(r io.Reader) error

type CborCid

type CborCid cid.Cid

func (*CborCid) MarshalCBOR

func (c *CborCid) MarshalCBOR(w io.Writer) error

func (*CborCid) UnmarshalCBOR

func (c *CborCid) UnmarshalCBOR(r io.Reader) error

type CborInt

type CborInt int64

func (*CborInt) MarshalCBOR

func (ci *CborInt) MarshalCBOR(w io.Writer) error

func (*CborInt) UnmarshalCBOR

func (ci *CborInt) UnmarshalCBOR(r io.Reader) error

type CborTime

type CborTime time.Time

func (*CborTime) MarshalCBOR

func (ct *CborTime) MarshalCBOR(w io.Writer) error

func (CborTime) MarshalJSON

func (ct CborTime) MarshalJSON() ([]byte, error)

func (CborTime) Time

func (ct CborTime) Time() time.Time

func (*CborTime) UnmarshalCBOR

func (ct *CborTime) UnmarshalCBOR(r io.Reader) error

func (*CborTime) UnmarshalJSON

func (ct *CborTime) UnmarshalJSON(b []byte) error

type Deferred

type Deferred struct {
	Raw []byte
}

func (*Deferred) MarshalCBOR

func (d *Deferred) MarshalCBOR(w io.Writer) error

func (*Deferred) UnmarshalCBOR

func (d *Deferred) UnmarshalCBOR(br io.Reader) error

type Field

type Field struct {
	Name    string
	Pointer bool
	Type    reflect.Type
	Pkg     string

	IterLabel string
}

func (Field) ElemName

func (f Field) ElemName() string

func (Field) IsArray

func (f Field) IsArray() bool

func (Field) Len

func (f Field) Len() int

func (Field) TypeName

func (f Field) TypeName() string

type GenTypeInfo

type GenTypeInfo struct {
	Name   string
	Fields []Field
}

func ParseTypeInfo

func ParseTypeInfo(i interface{}) (*GenTypeInfo, error)

func (*GenTypeInfo) Imports

func (gti *GenTypeInfo) Imports() []Import

func (GenTypeInfo) MapHeader

func (gti GenTypeInfo) MapHeader() []byte

func (GenTypeInfo) MapHeaderAsByteString

func (gti GenTypeInfo) MapHeaderAsByteString() string

func (*GenTypeInfo) NeedsScratch

func (gti *GenTypeInfo) NeedsScratch() bool

func (GenTypeInfo) TupleHeader

func (gti GenTypeInfo) TupleHeader() []byte

func (GenTypeInfo) TupleHeaderAsByteString

func (gti GenTypeInfo) TupleHeaderAsByteString() string

type Import

type Import struct {
	Name, PkgPath string
}

func ImportsForType

func ImportsForType(currPkg string, t reflect.Type) []Import

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL