Skip to content

Commit a1f2c0d

Browse files
committed
refactor: improve overlayFS errors
1 parent 60762d4 commit a1f2c0d

File tree

1 file changed

+24
-39
lines changed

1 file changed

+24
-39
lines changed

coderd/files/overlay.go

Lines changed: 24 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,10 @@ import (
88
"golang.org/x/xerrors"
99
)
1010

11-
// overlayFS allows you to "join" together the template files tar file fs.FS
12-
// with the Terraform modules tar file fs.FS. We could potentially turn this
13-
// into something more parameterized/configurable, but the requirements here are
14-
// a _bit_ odd, because every file in the modulesFS includes the
15-
// .terraform/modules/ folder at the beginning of it's path.
11+
// overlayFS allows you to "join" together multiple fs.FS. Files in any specific
12+
// overlay will only be accessible if their path starts with the base path
13+
// provided for the overlay. eg. An overlay at the path .terraform/modules
14+
// should contain files with paths inside the .terraform/modules folder.
1615
type overlayFS struct {
1716
baseFS fs.FS
1817
overlays []Overlay
@@ -23,64 +22,50 @@ type Overlay struct {
2322
fs.FS
2423
}
2524

26-
func NewOverlayFS(baseFS fs.FS, overlays []Overlay) (fs.FS, error) {
27-
if err := valid(baseFS); err != nil {
28-
return nil, xerrors.Errorf("baseFS: %w", err)
29-
}
30-
31-
for _, overlay := range overlays {
32-
if err := valid(overlay.FS); err != nil {
33-
return nil, xerrors.Errorf("overlayFS: %w", err)
34-
}
35-
}
36-
25+
func NewOverlayFS(baseFS fs.FS, overlays []Overlay) fs.FS {
3726
return overlayFS{
3827
baseFS: baseFS,
3928
overlays: overlays,
40-
}, nil
29+
}
4130
}
4231

4332
func (f overlayFS) Open(p string) (fs.File, error) {
33+
target := f.baseFS
4434
for _, overlay := range f.overlays {
4535
if strings.HasPrefix(path.Clean(p), overlay.Path) {
46-
return overlay.FS.Open(p)
36+
target = overlay.FS
37+
break
4738
}
4839
}
49-
return f.baseFS.Open(p)
40+
return target.Open(p)
5041
}
5142

5243
func (f overlayFS) ReadDir(p string) ([]fs.DirEntry, error) {
44+
target := f.baseFS
5345
for _, overlay := range f.overlays {
5446
if strings.HasPrefix(path.Clean(p), overlay.Path) {
55-
//nolint:forcetypeassert
56-
return overlay.FS.(fs.ReadDirFS).ReadDir(p)
47+
target = overlay.FS
48+
break
5749
}
5850
}
59-
//nolint:forcetypeassert
60-
return f.baseFS.(fs.ReadDirFS).ReadDir(p)
51+
it, ok := target.(fs.ReadDirFS)
52+
if !ok {
53+
return nil, xerrors.New("provided fs.FS does not implement fs.ReadDirFS")
54+
}
55+
return it.ReadDir(p)
6156
}
6257

6358
func (f overlayFS) ReadFile(p string) ([]byte, error) {
59+
target := f.baseFS
6460
for _, overlay := range f.overlays {
6561
if strings.HasPrefix(path.Clean(p), overlay.Path) {
66-
//nolint:forcetypeassert
67-
return overlay.FS.(fs.ReadFileFS).ReadFile(p)
62+
target = overlay.FS
63+
break
6864
}
6965
}
70-
//nolint:forcetypeassert
71-
return f.baseFS.(fs.ReadFileFS).ReadFile(p)
72-
}
73-
74-
// valid checks that the fs.FS implements the required interfaces.
75-
// The fs.FS interface is not sufficient.
76-
func valid(fsys fs.FS) error {
77-
_, ok := fsys.(fs.ReadDirFS)
78-
if !ok {
79-
return xerrors.New("overlayFS does not implement ReadDirFS")
80-
}
81-
_, ok = fsys.(fs.ReadFileFS)
66+
it, ok := target.(fs.ReadFileFS)
8267
if !ok {
83-
return xerrors.New("overlayFS does not implement ReadFileFS")
68+
return nil, xerrors.New("provided fs.FS does not implement fs.ReadFileFS")
8469
}
85-
return nil
70+
return it.ReadFile(p)
8671
}

0 commit comments

Comments
 (0)