64 lines
1.1 KiB
Go
64 lines
1.1 KiB
Go
|
|
package container
|
||
|
|
|
||
|
|
import (
|
||
|
|
"encoding/base64"
|
||
|
|
"io"
|
||
|
|
|
||
|
|
"github.com/ipfs/go-cid"
|
||
|
|
)
|
||
|
|
|
||
|
|
// TODO: should the invocation being set as root in the car file?
|
||
|
|
|
||
|
|
type Container map[cid.Cid][]byte
|
||
|
|
|
||
|
|
func New() Container {
|
||
|
|
return make(Container)
|
||
|
|
}
|
||
|
|
|
||
|
|
func FromCar(r io.Reader) (Container, error) {
|
||
|
|
_, it, err := readCar(r)
|
||
|
|
if err != nil {
|
||
|
|
return nil, err
|
||
|
|
}
|
||
|
|
|
||
|
|
c := New()
|
||
|
|
|
||
|
|
for block, err := range it {
|
||
|
|
if err != nil {
|
||
|
|
return nil, err
|
||
|
|
}
|
||
|
|
c[block.c] = block.data
|
||
|
|
}
|
||
|
|
|
||
|
|
return c, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
func FromCarBase64(r io.Reader) (Container, error) {
|
||
|
|
return FromCar(base64.NewDecoder(base64.StdEncoding, r))
|
||
|
|
}
|
||
|
|
|
||
|
|
func (ctn Container) ToCar(w io.Writer) error {
|
||
|
|
return writeCar(w, nil, func(yield func(carBlock) bool) {
|
||
|
|
for c, bytes := range ctn {
|
||
|
|
if !yield(carBlock{c: c, data: bytes}) {
|
||
|
|
return
|
||
|
|
}
|
||
|
|
}
|
||
|
|
})
|
||
|
|
}
|
||
|
|
|
||
|
|
func (ctn Container) ToCarBase64(w io.Writer) error {
|
||
|
|
w2 := base64.NewEncoder(base64.StdEncoding, w)
|
||
|
|
defer w2.Close()
|
||
|
|
return ctn.ToCar(w2)
|
||
|
|
}
|
||
|
|
|
||
|
|
func (ctn Container) AddBytes(cid cid.Cid, data []byte) {
|
||
|
|
ctn[cid] = data
|
||
|
|
}
|
||
|
|
|
||
|
|
func (ctn Container) GetBytes(cid cid.Cid) ([]byte, bool) {
|
||
|
|
b, ok := ctn[cid]
|
||
|
|
return b, ok
|
||
|
|
}
|