Ctrl K
ComunidadGuías…

pkg/tarstream/datavec.go

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
package tarstream

import (
	"bytes"
	"io"
	"os"
)

// MemVec is a buffer vec type
type MemVec struct {
	Data []byte
}

// PathVec is a filename vec type
type PathVec struct {
	Path string
	Info os.FileInfo
}

// PadVec is a padding (0s) vec type
type PadVec struct {
	Size int64
}

type DataReader interface {
	io.ReaderAt
	io.Closer
}

func nopCloser(r io.ReaderAt) DataReader {
	return noopCloser{r}
}

type noopCloser struct {
	io.ReaderAt
}

func (n noopCloser) Close() error { return nil }

// Datavec is an interface for all vector types
type Datavec interface {
	Clone() Datavec
	GetSize() int64
	Open() (DataReader, error)
}

// GetSize gets the size of the memory vec
func (m MemVec) GetSize() int64 {
	return int64(len(m.Data))
}

func (m MemVec) Clone() Datavec {
	return m
}

// Open opens a memory vec
func (m MemVec) Open() (DataReader, error) {
	return nopCloser(bytes.NewReader(m.Data)), nil
}

// GetSize gets the file size of the path vec
func (p PathVec) GetSize() int64 {
	return p.Info.Size()
}

// Open opens a file represented by a path vec
func (p *PathVec) Open() (DataReader, error) {
	return os.Open(p.Path)
}

func (p *PathVec) Clone() Datavec {
	return p
}

// GetSize gets the size of the padding vec
func (p PadVec) GetSize() int64 {
	return p.Size
}

// Open opens the padding vec
func (p PadVec) Open() (DataReader, error) {
	return padReader{p.Size}, nil
}

func (p PadVec) Clone() Datavec {
	return p
}

type padReader struct {
	size int64
}

func (r padReader) ReadAt(b []byte, off int64) (int, error) {
	rem := int(r.size - off)
	if rem == 0 {
		return 0, io.EOF
	}

	n := min(rem, len(b))
	for i := range n {
		b[i] = 0
	}
	return n, nil
}

func (r padReader) Close() error {
	return nil
}