blob: 0da3bbd54413c6ac47cd895428906bd386b3ca32 [file] [log] [blame]
Giorgi Lekveishvili970316a2023-11-08 13:07:35 +04001package apprepo
2
3import (
4 "io"
5 "io/fs"
6 "log"
7 "strings"
8
9 "golang.org/x/mod/semver"
10)
11
12type Loader interface {
13 Load() ([]App, error)
14}
15
16type fsApp struct {
17 name string
18 version string
19 fs fs.FS
20 path string
21}
22
23func (a *fsApp) Name() string {
24 return a.name
25}
26
27func (a *fsApp) Version() string {
28 return a.version
29}
30
31func (a *fsApp) Reader() (io.ReadCloser, error) {
32 return a.fs.Open(a.path)
33}
34
35type fsLoader struct {
36 fs fs.FS
37}
38
39func NewFSLoader(fs fs.FS) Loader {
40 return &fsLoader{fs}
41}
42
43func (l *fsLoader) Load() ([]App, error) {
44 entries, err := fs.ReadDir(l.fs, ".")
45 if err != nil {
46 return nil, err
47 }
48 apps := make([]App, 0)
49 for _, e := range entries {
50 log.Println(e.Name())
51 if !e.IsDir() && strings.HasSuffix(e.Name(), ".tar.gz") {
52 items := strings.Split(strings.TrimSuffix(e.Name(), ".tar.gz"), "-")
53 if len(items) <= 1 {
54 continue
55 }
56 version := items[len(items)-1]
57 if semver.IsValid(version) || semver.IsValid("v"+version) {
58 name := strings.Join(items[:len(items)-1], "-")
59 apps = append(apps, &fsApp{name, strings.TrimPrefix(version, "v"), l.fs, e.Name()})
60 }
61 }
62 }
63 return apps, nil
64}