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