1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
diff --git a/overlay.go b/overlay.go
index 8dab55d4f2bfc65b08fb7b47be9f2b02bffbca84..512bf1c77ece17e9cc8deba0777e8c8ea60d8e10 100644
--- a/overlay.go
+++ b/overlay.go
@@ -6,6 +6,10 @@ "os"
"path"
)
+// Interface guard
+// fs.ReadFileFS also fulfills fs.FS
+var _ fs.ReadFileFS = (*FS)(nil)
+
// FS is an overlay File System
type FS struct {
fs fs.FS
@@ -39,6 +43,14 @@ }
return f.fs.Open(name)
}
+// ReadFile reads a file, preferring disk
+func (f *FS) ReadFile(name string) ([]byte, error) {
+ if f.exists(name) {
+ return os.ReadFile(f.apn(name))
+ }
+ return fs.ReadFile(f.fs, name)
+}
+
// ReadDir reads []fs.DirEntry
// This method will prefer EMBEDDED, because that is the "real" FS for overlay
func (f *FS) ReadDir(name string) ([]fs.DirEntry, error) {
@@ -64,6 +76,15 @@ }
}
return x, nil
+}
+
+// MustNew returns New and panics on error
+func MustNew(root string, fs fs.FS, opts ...Option) *FS {
+ f, err := New(root, fs, opts...)
+ if err != nil {
+ panic(err)
+ }
+ return f
}
// WithSub sets a fs.Sub for an FS
|