aboutsummaryrefslogtreecommitdiffstats
path: root/storage/memory/object.go
diff options
context:
space:
mode:
Diffstat (limited to 'storage/memory/object.go')
-rw-r--r--storage/memory/object.go55
1 files changed, 55 insertions, 0 deletions
diff --git a/storage/memory/object.go b/storage/memory/object.go
new file mode 100644
index 0000000..7fee252
--- /dev/null
+++ b/storage/memory/object.go
@@ -0,0 +1,55 @@
+package memory
+
+import (
+ "bytes"
+ "io"
+
+ "gopkg.in/src-d/go-git.v2/core"
+)
+
+// Object on memory core.Object implementation
+type Object struct {
+ t core.ObjectType
+ h core.Hash
+ content []byte
+ size int64
+}
+
+// Hash return the object Hash, the hash is calculated on-the-fly the first
+// time is called, the subsequent calls the same Hash is returned even in the
+// type or the content has changed. The Hash is only generated if the size of
+// the content is exactly the Object.Size
+func (o *Object) Hash() core.Hash {
+ if o.h == core.ZeroHash && int64(len(o.content)) == o.size {
+ o.h = core.ComputeHash(o.t, o.content)
+ }
+
+ return o.h
+}
+
+// Type return the core.ObjectType
+func (o *Object) Type() core.ObjectType { return o.t }
+
+// SetType sets the core.ObjectType
+func (o *Object) SetType(t core.ObjectType) { o.t = t }
+
+// Size return the size of the object
+func (o *Object) Size() int64 { return o.size }
+
+// SetSize set the object size, the given size should be written afterwards
+func (o *Object) SetSize(s int64) { o.size = s }
+
+// Reader returns a io.Reader used to read the object content
+func (o *Object) Reader() io.Reader {
+ return bytes.NewBuffer(o.content)
+}
+
+// Writer returns a io.Writed used to write the object content
+func (o *Object) Writer() io.Writer {
+ return o
+}
+
+func (o *Object) Write(p []byte) (n int, err error) {
+ o.content = append(o.content, p...)
+ return len(p), nil
+}