package tar2go import ( "archive/tar" "io" "io/fs" "time" ) type file struct { idx *indexReader rdr *io.SectionReader } func newFile(idx *indexReader) *file { return &file{idx: idx, rdr: io.NewSectionReader(idx.rdr, idx.offset, idx.size)} } type fileinfo struct { h *tar.Header } func (f *fileinfo) Name() string { return f.h.Name } func (f *fileinfo) Size() int64 { return f.h.Size } func (f *fileinfo) Mode() fs.FileMode { return fs.FileMode(f.h.Mode) } func (f *fileinfo) ModTime() time.Time { return f.h.ModTime } func (f *fileinfo) IsDir() bool { return f.h.Typeflag == tar.TypeDir } func (f *file) Close() error { return nil } func (f *fileinfo) Sys() interface{} { h := *f.h return &h } func (f *file) Read(p []byte) (int, error) { return f.rdr.Read(p) } func (f *file) ReadAt(p []byte, off int64) (int, error) { return f.rdr.ReadAt(p, off) } func (f *file) Size() int64 { return f.rdr.Size() } func (f *file) Stat() (fs.FileInfo, error) { return &fileinfo{h: f.idx.hdr}, nil }