36533f7c3f
Fixes for new geth version
73 lines
2.0 KiB
Go
73 lines
2.0 KiB
Go
package cbornode
|
|
|
|
import (
|
|
"math/big"
|
|
|
|
cid "github.com/ipfs/go-cid"
|
|
|
|
encoding "github.com/ipfs/go-ipld-cbor/encoding"
|
|
|
|
"github.com/polydawn/refmt/obj/atlas"
|
|
)
|
|
|
|
// This atlas describes the CBOR Tag (42) for IPLD links, such that refmt can marshal and unmarshal them
|
|
var cidAtlasEntry = atlas.BuildEntry(cid.Cid{}).
|
|
UseTag(CBORTagLink).
|
|
Transform().
|
|
TransformMarshal(atlas.MakeMarshalTransformFunc(
|
|
castCidToBytes,
|
|
)).
|
|
TransformUnmarshal(atlas.MakeUnmarshalTransformFunc(
|
|
castBytesToCid,
|
|
)).
|
|
Complete()
|
|
|
|
// BigIntAtlasEntry gives a reasonable default encoding for big.Int. It is not
|
|
// included in the entries by default.
|
|
var BigIntAtlasEntry = atlas.BuildEntry(big.Int{}).Transform().
|
|
TransformMarshal(atlas.MakeMarshalTransformFunc(
|
|
func(i big.Int) ([]byte, error) {
|
|
return i.Bytes(), nil
|
|
})).
|
|
TransformUnmarshal(atlas.MakeUnmarshalTransformFunc(
|
|
func(x []byte) (big.Int, error) {
|
|
return *big.NewInt(0).SetBytes(x), nil
|
|
})).
|
|
Complete()
|
|
|
|
// CborAtlas is the refmt.Atlas used by the CBOR IPLD decoder/encoder.
|
|
var CborAtlas atlas.Atlas
|
|
var cborSortingMode = atlas.KeySortMode_RFC7049
|
|
var atlasEntries = []*atlas.AtlasEntry{cidAtlasEntry}
|
|
|
|
var (
|
|
cloner encoding.PooledCloner
|
|
unmarshaller encoding.PooledUnmarshaller
|
|
marshaller encoding.PooledMarshaller
|
|
)
|
|
|
|
func init() {
|
|
rebuildAtlas()
|
|
}
|
|
|
|
func rebuildAtlas() {
|
|
CborAtlas = atlas.MustBuild(atlasEntries...).
|
|
WithMapMorphism(atlas.MapMorphism{KeySortMode: atlas.KeySortMode_RFC7049})
|
|
|
|
marshaller = encoding.NewPooledMarshaller(CborAtlas)
|
|
unmarshaller = encoding.NewPooledUnmarshaller(CborAtlas)
|
|
cloner = encoding.NewPooledCloner(CborAtlas)
|
|
}
|
|
|
|
// RegisterCborType allows to register a custom cbor type
|
|
func RegisterCborType(i interface{}) {
|
|
var entry *atlas.AtlasEntry
|
|
if ae, ok := i.(*atlas.AtlasEntry); ok {
|
|
entry = ae
|
|
} else {
|
|
entry = atlas.BuildEntry(i).StructMap().AutogenerateWithSortingScheme(atlas.KeySortMode_RFC7049).Complete()
|
|
}
|
|
atlasEntries = append(atlasEntries, entry)
|
|
rebuildAtlas()
|
|
}
|