aboutsummaryrefslogtreecommitdiff
path: root/object/store/memory/reader.go
blob: 6b8fae5554185e1a0e8032f6437e9f843d95b4af (about) (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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package memory

import (
	"bytes"
	"io"

	"lindenii.org/go/furgit/object/header"
	"lindenii.org/go/furgit/object/id"
	"lindenii.org/go/furgit/object/store"
	"lindenii.org/go/furgit/object/typ"
)

// ReadBytesFull reads one full object, including the object header.
func (memory *Memory) ReadBytesFull(id id.ObjectID) ([]byte, error) {
	obj, ok := memory.objects.Load(id)
	if !ok {
		return nil, store.ErrObjectNotFound
	}

	raw := header.Append(nil, obj.ty, len(obj.content))
	raw = append(raw, obj.content...)

	return raw, nil
}

// ReadBytesContent reads one object body.
func (memory *Memory) ReadBytesContent(id id.ObjectID) (typ.Type, []byte, error) {
	obj, ok := memory.objects.Load(id)
	if !ok {
		return typ.Unknown, nil, store.ErrObjectNotFound
	}

	return obj.ty, append([]byte(nil), obj.content...), nil
}

// ReadHeader reads one object header.
func (memory *Memory) ReadHeader(id id.ObjectID) (typ.Type, int, error) {
	obj, ok := memory.objects.Load(id)
	if !ok {
		return typ.Unknown, 0, store.ErrObjectNotFound
	}

	return obj.ty, len(obj.content), nil
}

// ReadSize reads one object size.
func (memory *Memory) ReadSize(id id.ObjectID) (int, error) {
	_, size, err := memory.ReadHeader(id)
	if err != nil {
		return 0, err
	}

	return size, nil
}

// ReadReaderFull reads one full object through a reader.
func (memory *Memory) ReadReaderFull(id id.ObjectID) (io.ReadCloser, error) {
	raw, err := memory.ReadBytesFull(id)
	if err != nil {
		return nil, err
	}

	return io.NopCloser(bytes.NewReader(raw)), nil
}

// ReadReaderContent reads one object body through a reader.
func (memory *Memory) ReadReaderContent(id id.ObjectID) (typ.Type, int, io.ReadCloser, error) {
	ty, content, err := memory.ReadBytesContent(id)
	if err != nil {
		return typ.Unknown, 0, nil, err
	}

	return ty, len(content), io.NopCloser(bytes.NewReader(content)), nil
}

// Refresh is a no-op for in-memory object stores.
func (memory *Memory) Refresh() error {
	return nil
}