76 lines
1.4 KiB
Go
76 lines
1.4 KiB
Go
|
package assetserver
|
||
|
|
||
|
import (
|
||
|
"embed"
|
||
|
"fmt"
|
||
|
"io/fs"
|
||
|
"os"
|
||
|
"path/filepath"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
// FindEmbedRootPath finds the root path in the embed FS. It's the directory which contains all the files.
|
||
|
func FindEmbedRootPath(fsys embed.FS) (string, error) {
|
||
|
stopErr := fmt.Errorf("files or multiple dirs found")
|
||
|
|
||
|
fPath := ""
|
||
|
err := fs.WalkDir(fsys, ".", func(path string, d fs.DirEntry, err error) error {
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
if d.IsDir() {
|
||
|
fPath = path
|
||
|
if entries, dErr := fs.ReadDir(fsys, path); dErr != nil {
|
||
|
return dErr
|
||
|
} else if len(entries) <= 1 {
|
||
|
return nil
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return stopErr
|
||
|
})
|
||
|
|
||
|
if err != nil && err != stopErr {
|
||
|
return "", err
|
||
|
}
|
||
|
|
||
|
return fPath, nil
|
||
|
}
|
||
|
|
||
|
func FindPathToFile(fsys fs.FS, file string) (string, error) {
|
||
|
stat, _ := fs.Stat(fsys, file)
|
||
|
if stat != nil {
|
||
|
return ".", nil
|
||
|
}
|
||
|
var indexFiles []string
|
||
|
err := fs.WalkDir(fsys, ".", func(path string, d fs.DirEntry, err error) error {
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
if strings.HasSuffix(path, file) {
|
||
|
indexFiles = append(indexFiles, path)
|
||
|
}
|
||
|
return nil
|
||
|
})
|
||
|
if err != nil {
|
||
|
return "", err
|
||
|
}
|
||
|
|
||
|
if len(indexFiles) > 1 {
|
||
|
selected := indexFiles[0]
|
||
|
for _, f := range indexFiles {
|
||
|
if len(f) < len(selected) {
|
||
|
selected = f
|
||
|
}
|
||
|
}
|
||
|
path, _ := filepath.Split(selected)
|
||
|
return path, nil
|
||
|
}
|
||
|
if len(indexFiles) > 0 {
|
||
|
path, _ := filepath.Split(indexFiles[0])
|
||
|
return path, nil
|
||
|
}
|
||
|
return "", fmt.Errorf("%s: %w", file, os.ErrNotExist)
|
||
|
}
|