package fslocal import ( "fmt" "os" "github.com/bmatcuk/doublestar/v4" ) // FS represents a local file system type FS struct { // Pattern is used for matching one or multiple files. // The pattern may describe hierarchical names such as // /usr/*/bin/ed (assuming the Separator is '/'). Pattern string } // Init verifies that configured Pattern is correct func (fs *FS) Init() error { _, err := doublestar.FilepathGlob(fs.Pattern) return err } // String implements Stringer interface func (fs *FS) String() string { return fmt.Sprintf("Local FS{MatchPattern: %q}", fs.Pattern) } // List returns the list of file names which will be read via Read fn func (fs *FS) List() ([]string, error) { matches, err := doublestar.FilepathGlob(fs.Pattern) if err != nil { return nil, fmt.Errorf("error while matching files via pattern %s: %w", fs.Pattern, err) } return matches, nil } // Read returns a map of read files where // key is the file name and value is file's content. func (fs *FS) Read(files []string) (map[string][]byte, error) { result := make(map[string][]byte) for _, path := range files { data, err := os.ReadFile(path) if err != nil { return nil, fmt.Errorf("error while reading file %q: %w", path, err) } result[path] = data } return result, nil }