sub.go 754 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. package hackpadfs
  2. import (
  3. "path"
  4. )
  5. var _ interface {
  6. FS
  7. MountFS
  8. } = &subFS{}
  9. type subFS struct {
  10. rootFS FS
  11. basePath string
  12. }
  13. func newSubFS(fs FS, dir string) (FS, error) {
  14. if !ValidPath(dir) {
  15. return nil, &PathError{Op: "sub", Path: dir, Err: ErrInvalid}
  16. }
  17. return &subFS{
  18. basePath: dir,
  19. rootFS: fs,
  20. }, nil
  21. }
  22. func (fs *subFS) Open(name string) (File, error) {
  23. if !ValidPath(name) {
  24. return nil, &PathError{Op: "open", Path: name, Err: ErrInvalid}
  25. }
  26. mount, subPath := fs.Mount(name)
  27. file, err := mount.Open(subPath)
  28. return file, stripErrPathPrefix(err, name, subPath)
  29. }
  30. func (fs *subFS) Mount(p string) (mount FS, subPath string) {
  31. if !ValidPath(p) {
  32. return fs.rootFS, p
  33. }
  34. return fs.rootFS, path.Join(fs.basePath, p)
  35. }