package fs
import (
)
type SubFS interface {
FS
Sub(dir string) (FS, error)
}
func ( FS, string) (FS, error) {
if !ValidPath() {
return nil, &PathError{Op: "sub", Path: , Err: ErrInvalid}
}
if == "." {
return , nil
}
if , := .(SubFS); {
return .Sub()
}
return &subFS{, }, nil
}
var _ FS = (*subFS)(nil)
var _ ReadDirFS = (*subFS)(nil)
var _ ReadFileFS = (*subFS)(nil)
var _ ReadLinkFS = (*subFS)(nil)
var _ GlobFS = (*subFS)(nil)
type subFS struct {
fsys FS
dir string
}
func ( *subFS) ( string, string) (string, error) {
if !ValidPath() {
return "", &PathError{Op: , Path: , Err: ErrInvalid}
}
return path.Join(.dir, ), nil
}
func ( *subFS) ( string) ( string, bool) {
if == .dir {
return ".", true
}
if len() >= len(.dir)+2 && [len(.dir)] == '/' && [:len(.dir)] == .dir {
return [len(.dir)+1:], true
}
return "", false
}
func ( *subFS) ( error) error {
if , := .(*PathError); {
if , := .shorten(.Path); {
.Path =
}
}
return
}
func ( *subFS) ( string) (File, error) {
, := .fullName("open", )
if != nil {
return nil,
}
, := .fsys.Open()
return , .fixErr()
}
func ( *subFS) ( string) ([]DirEntry, error) {
, := .fullName("read", )
if != nil {
return nil,
}
, := ReadDir(.fsys, )
return , .fixErr()
}
func ( *subFS) ( string) ([]byte, error) {
, := .fullName("read", )
if != nil {
return nil,
}
, := ReadFile(.fsys, )
return , .fixErr()
}
func ( *subFS) ( string) (string, error) {
, := .fullName("readlink", )
if != nil {
return "",
}
, := ReadLink(.fsys, )
if != nil {
return "", .fixErr()
}
return , nil
}
func ( *subFS) ( string) (FileInfo, error) {
, := .fullName("lstat", )
if != nil {
return nil,
}
, := Lstat(.fsys, )
if != nil {
return nil, .fixErr()
}
return , nil
}
func ( *subFS) ( string) ([]string, error) {
if , := path.Match(, ""); != nil {
return nil,
}
if == "." {
return []string{"."}, nil
}
:= .dir + "/" +
, := Glob(.fsys, )
for , := range {
, := .shorten()
if ! {
return nil, errors.New("invalid result from inner fsys Glob: " + + " not in " + .dir)
}
[] =
}
return , .fixErr()
}
func ( *subFS) ( string) (FS, error) {
if == "." {
return , nil
}
, := .fullName("sub", )
if != nil {
return nil,
}
return &subFS{.fsys, }, nil
}