fs is dir entry

This commit is contained in:
royalcat 2024-03-20 13:49:19 +03:00
parent e576e62599
commit fd3beea874
12 changed files with 172 additions and 27 deletions
src/host/vfs

View file

@ -9,20 +9,20 @@ import (
"sync"
)
type ResolveFS struct {
type ResolverFS struct {
rootFS Filesystem
resolver *resolver
}
func NewResolveFS(rootFs Filesystem, factories map[string]FsFactory) *ResolveFS {
return &ResolveFS{
func NewResolveFS(rootFs Filesystem, factories map[string]FsFactory) *ResolverFS {
return &ResolverFS{
rootFS: rootFs,
resolver: newResolver(factories),
}
}
// Open implements Filesystem.
func (r *ResolveFS) Open(filename string) (File, error) {
func (r *ResolverFS) Open(filename string) (File, error) {
fsPath, nestedFs, nestedFsPath, err := r.resolver.resolvePath(filename, r.rootFS.Open)
if err != nil {
return nil, err
@ -35,7 +35,7 @@ func (r *ResolveFS) Open(filename string) (File, error) {
}
// ReadDir implements Filesystem.
func (r *ResolveFS) ReadDir(dir string) ([]fs.DirEntry, error) {
func (r *ResolverFS) ReadDir(dir string) ([]fs.DirEntry, error) {
fsPath, nestedFs, nestedFsPath, err := r.resolver.resolvePath(dir, r.rootFS.Open)
if err != nil {
return nil, err
@ -56,16 +56,12 @@ func (r *ResolveFS) ReadDir(dir string) ([]fs.DirEntry, error) {
if err != nil {
return nil, err
}
nfs, err := r.resolver.nestedFs(filepath, file)
nestedfs, err := r.resolver.nestedFs(filepath, file)
if err != nil {
return nil, err
}
if e, ok := nfs.(fs.DirEntry); ok {
out = append(out, e)
} else {
out = append(out, newDirInfo(e.Name()))
}
out = append(out, nestedfs)
} else {
out = append(out, e)
}
@ -74,7 +70,7 @@ func (r *ResolveFS) ReadDir(dir string) ([]fs.DirEntry, error) {
}
// Stat implements Filesystem.
func (r *ResolveFS) Stat(filename string) (fs.FileInfo, error) {
func (r *ResolverFS) Stat(filename string) (fs.FileInfo, error) {
fsPath, nestedFs, nestedFsPath, err := r.resolver.resolvePath(filename, r.rootFS.Open)
if err != nil {
return nil, err
@ -87,7 +83,7 @@ func (r *ResolveFS) Stat(filename string) (fs.FileInfo, error) {
}
// Unlink implements Filesystem.
func (r *ResolveFS) Unlink(filename string) error {
func (r *ResolverFS) Unlink(filename string) error {
fsPath, nestedFs, nestedFsPath, err := r.resolver.resolvePath(filename, r.rootFS.Open)
if err != nil {
return err
@ -99,7 +95,27 @@ func (r *ResolveFS) Unlink(filename string) error {
return r.rootFS.Unlink(fsPath)
}
var _ Filesystem = &ResolveFS{}
// Info implements Filesystem.
func (r *ResolverFS) Info() (fs.FileInfo, error) {
return newDirInfo(r.rootFS.Name()), nil
}
// IsDir implements Filesystem.
func (r *ResolverFS) IsDir() bool {
return true
}
// Name implements Filesystem.
func (r *ResolverFS) Name() string {
return r.Name()
}
// Type implements Filesystem.
func (r *ResolverFS) Type() fs.FileMode {
return fs.ModeDir
}
var _ Filesystem = &ResolverFS{}
type FsFactory func(f File) (Filesystem, error)