62 lines
1.6 KiB
Go
62 lines
1.6 KiB
Go
|
package plumbing
|
||
|
|
||
|
import (
|
||
|
"bytes"
|
||
|
"io"
|
||
|
"io/ioutil"
|
||
|
)
|
||
|
|
||
|
// MemoryObject on memory Object implementation
|
||
|
type MemoryObject struct {
|
||
|
t ObjectType
|
||
|
h Hash
|
||
|
cont []byte
|
||
|
sz int64
|
||
|
}
|
||
|
|
||
|
// Hash returns the object Hash, the hash is calculated on-the-fly the first
|
||
|
// time it's called, in all subsequent calls the same Hash is returned even
|
||
|
// if the type or the content have changed. The Hash is only generated if the
|
||
|
// size of the content is exactly the object size.
|
||
|
func (o *MemoryObject) Hash() Hash {
|
||
|
if o.h == ZeroHash && int64(len(o.cont)) == o.sz {
|
||
|
o.h = ComputeHash(o.t, o.cont)
|
||
|
}
|
||
|
|
||
|
return o.h
|
||
|
}
|
||
|
|
||
|
// Type return the ObjectType
|
||
|
func (o *MemoryObject) Type() ObjectType { return o.t }
|
||
|
|
||
|
// SetType sets the ObjectType
|
||
|
func (o *MemoryObject) SetType(t ObjectType) { o.t = t }
|
||
|
|
||
|
// Size return the size of the object
|
||
|
func (o *MemoryObject) Size() int64 { return o.sz }
|
||
|
|
||
|
// SetSize set the object size, a content of the given size should be written
|
||
|
// afterwards
|
||
|
func (o *MemoryObject) SetSize(s int64) { o.sz = s }
|
||
|
|
||
|
// Reader returns a ObjectReader used to read the object's content.
|
||
|
func (o *MemoryObject) Reader() (io.ReadCloser, error) {
|
||
|
return ioutil.NopCloser(bytes.NewBuffer(o.cont)), nil
|
||
|
}
|
||
|
|
||
|
// Writer returns a ObjectWriter used to write the object's content.
|
||
|
func (o *MemoryObject) Writer() (io.WriteCloser, error) {
|
||
|
return o, nil
|
||
|
}
|
||
|
|
||
|
func (o *MemoryObject) Write(p []byte) (n int, err error) {
|
||
|
o.cont = append(o.cont, p...)
|
||
|
o.sz = int64(len(o.cont))
|
||
|
|
||
|
return len(p), nil
|
||
|
}
|
||
|
|
||
|
// Close releases any resources consumed by the object when it is acting as a
|
||
|
// ObjectWriter.
|
||
|
func (o *MemoryObject) Close() error { return nil }
|