Restructure for 1.16 io/fs interface

This commit is contained in:
Caleb Gardner
2021-01-29 12:55:57 -06:00
parent dd08d3516d
commit 3f1b2a8d1e
7 changed files with 1004 additions and 690 deletions
+89
View File
@@ -0,0 +1,89 @@
package squashfs
import (
"io/fs"
"path"
"strings"
"github.com/CalebQ42/squashfs/internal/directory"
)
type FS struct {
r *Reader
parent *FS
entries []*directory.Entry
}
func (f FS) Open(name string) (fs.File, error) {
if !fs.ValidPath(name) {
return nil, &fs.PathError{
Op: "open",
Path: name,
Err: fs.ErrInvalid,
}
}
name = path.Clean(strings.TrimPrefix(name, "/"))
split := strings.Split(name, "/")
for i := 0; i < len(f.entries); i++ {
if match, _ := path.Match(split[0], f.entries[i].Name); match {
if len(split) == 1 {
return f.r.newFileFromDirEntry(f.entries[i], &f)
}
sub, err := f.Sub(split[0])
if err != nil {
if pathErr, ok := err.(*fs.PathError); ok {
pathErr.Op = "open"
pathErr.Path = name
return nil, err
}
return nil, &fs.PathError{
Op: "open",
Path: name,
Err: err,
}
}
fil, err := sub.Open(strings.Join(split[1:], "/"))
if err != nil {
if pathErr, ok := err.(*fs.PathError); ok {
if pathErr.Err == fs.ErrNotExist {
continue
}
pathErr.Op = "open"
pathErr.Path = name
return nil, err
}
return nil, &fs.PathError{
Op: "open",
Path: name,
Err: err,
}
}
return fil, nil
}
}
return nil, &fs.PathError{
Op: "open",
Path: name,
Err: fs.ErrNotExist,
}
}
func (f FS) Glob(pattern string) ([]string, error) {
return nil, nil
}
func (f FS) ReadDir(name string) ([]DirEntry, error) {
return nil, nil
}
func (f FS) ReadFile(name string) ([]byte, error) {
return nil, nil
}
func (f FS) Stat(name string) ([]byte, error) {
return nil, nil
}
func (f FS) Sub(dir string) (fs.FS, error) {
return nil, nil
}