aboutsummaryrefslogtreecommitdiffstats
path: root/storage/memory/object.go
blob: 7fee2524770465cbee49734739e73dda97ca011d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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
}