mirror of
https://github.com/Luzifer/go_helpers.git
synced 2024-12-25 13:31:21 +00:00
Add file.FSStack implementation
Signed-off-by: Knut Ahlers <knut@ahlers.me>
This commit is contained in:
parent
b1f81b0d32
commit
84961abdf9
1 changed files with 48 additions and 0 deletions
48
file/fsstack.go
Normal file
48
file/fsstack.go
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
package file
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io"
|
||||||
|
"io/fs"
|
||||||
|
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
)
|
||||||
|
|
||||||
|
// FSStack represents layers of fs.FS to open a file from. The first
|
||||||
|
// layer (starting at index 0, going up) responding other than
|
||||||
|
// fs.ErrNotExist will determine the response of this stack.
|
||||||
|
type FSStack []fs.FS
|
||||||
|
|
||||||
|
var _ fs.FS = FSStack{}
|
||||||
|
|
||||||
|
// Open iterates the FSStack starting at index 0, going up and returns
|
||||||
|
// the first non fs.ErrNotExist response. If all layers responds with
|
||||||
|
// fs.ErrNotExist a fs.PathError wrapping fs.ErrNotExist is returned.
|
||||||
|
func (f FSStack) Open(name string) (fs.File, error) {
|
||||||
|
for i, fse := range f {
|
||||||
|
file, err := fse.Open(name)
|
||||||
|
if err != nil {
|
||||||
|
if errors.Is(err, fs.ErrNotExist) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil, errors.Wrapf(err, "opening file from layer %d", i)
|
||||||
|
}
|
||||||
|
|
||||||
|
return file, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil, &fs.PathError{Op: "open", Path: name, Err: fs.ErrNotExist}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ReadFile is a convenice wrapper around Open and returns the content
|
||||||
|
// of the file if any is available.
|
||||||
|
func (f FSStack) ReadFile(name string) ([]byte, error) {
|
||||||
|
file, err := f.Open(name)
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.Wrap(err, "opening file")
|
||||||
|
}
|
||||||
|
defer file.Close()
|
||||||
|
|
||||||
|
content, err := io.ReadAll(file)
|
||||||
|
return content, errors.Wrap(err, "reading content")
|
||||||
|
}
|
Loading…
Reference in a new issue