This provides a way to create a CID without having to read all data into memory before passing it into Sum. Instead, call SumStream passing in an io.Reader.
97 lines
1.6 KiB
Go
97 lines
1.6 KiB
Go
package cid
|
|
|
|
import (
|
|
"io"
|
|
|
|
mh "github.com/multiformats/go-multihash"
|
|
)
|
|
|
|
type Builder interface {
|
|
Sum(data []byte) (Cid, error)
|
|
GetCodec() uint64
|
|
WithCodec(uint64) Builder
|
|
}
|
|
|
|
type V0Builder struct{}
|
|
|
|
type V1Builder struct {
|
|
Codec uint64
|
|
MhType uint64
|
|
MhLength int // MhLength <= 0 means the default length
|
|
}
|
|
|
|
func (p Prefix) GetCodec() uint64 {
|
|
return p.Codec
|
|
}
|
|
|
|
func (p Prefix) WithCodec(c uint64) Builder {
|
|
if c == p.Codec {
|
|
return p
|
|
}
|
|
p.Codec = c
|
|
if c != DagProtobuf {
|
|
p.Version = 1
|
|
}
|
|
return p
|
|
}
|
|
|
|
func (p V0Builder) Sum(data []byte) (Cid, error) {
|
|
hash, err := mh.Sum(data, mh.SHA2_256, -1)
|
|
if err != nil {
|
|
return Undef, err
|
|
}
|
|
return Cid{string(hash)}, nil
|
|
}
|
|
|
|
func (p V0Builder) SumStream(r io.Reader) (Cid, error) {
|
|
hash, err := mh.SumStream(r, mh.SHA2_256, -1)
|
|
if err != nil {
|
|
return Undef, err
|
|
}
|
|
return Cid{string(hash)}, nil
|
|
}
|
|
|
|
func (p V0Builder) GetCodec() uint64 {
|
|
return DagProtobuf
|
|
}
|
|
|
|
func (p V0Builder) WithCodec(c uint64) Builder {
|
|
if c == DagProtobuf {
|
|
return p
|
|
}
|
|
return V1Builder{Codec: c, MhType: mh.SHA2_256}
|
|
}
|
|
|
|
func (p V1Builder) Sum(data []byte) (Cid, error) {
|
|
mhLen := p.MhLength
|
|
if mhLen <= 0 {
|
|
mhLen = -1
|
|
}
|
|
hash, err := mh.Sum(data, p.MhType, mhLen)
|
|
if err != nil {
|
|
return Undef, err
|
|
}
|
|
return NewCidV1(p.Codec, hash), nil
|
|
}
|
|
|
|
func (p V1Builder) SumStream(r io.Reader) (Cid, error) {
|
|
mhLen := p.MhLength
|
|
if mhLen <= 0 {
|
|
mhLen = -1
|
|
}
|
|
hash, err := mh.SumStream(r, p.MhType, mhLen)
|
|
if err != nil {
|
|
return Undef, err
|
|
}
|
|
return NewCidV1(p.Codec, hash), nil
|
|
}
|
|
|
|
func (p V1Builder) GetCodec() uint64 {
|
|
return p.Codec
|
|
}
|
|
|
|
func (p V1Builder) WithCodec(c uint64) Builder {
|
|
p.Codec = c
|
|
return p
|
|
}
|