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 }