| 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 } |