github.com/criteo/command-launcher@v0.0.0-20230407142452-fb616f546e98/internal/repository/json-repo-index.go (about) 1 package repository 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "os" 7 8 "github.com/criteo/command-launcher/internal/command" 9 ) 10 11 type jsonRepoIndex struct { 12 defaultRepoIndex 13 pathname string 14 } 15 16 func newJsonRepoIndex(id, path string) (RepoIndex, error) { 17 reg := jsonRepoIndex{ 18 defaultRepoIndex: defaultRepoIndex{ 19 id: id, 20 packages: make(map[string]command.PackageManifest), 21 packageDirs: make(map[string]string), 22 groupCmds: make(map[string]command.Command), 23 executableCmds: make(map[string]command.Command), 24 systemCmds: make(map[string]command.Command), 25 }, 26 pathname: path, 27 } 28 29 return ®, nil 30 } 31 32 func (reg *jsonRepoIndex) Load(repoDir string) error { 33 _, err := os.Stat(reg.pathname) 34 if !os.IsNotExist(err) { 35 payload, err := os.ReadFile(reg.pathname) 36 if err != nil { 37 return err 38 } 39 40 packages := make(map[string]*defaultRepoIndexEntry, 0) 41 if err = json.Unmarshal(payload, &packages); err != nil { 42 return err 43 } 44 45 for name, pkg := range packages { 46 reg.packages[name] = pkg 47 } 48 } 49 50 reg.extractCmds(repoDir) 51 52 return nil 53 } 54 55 func (reg *jsonRepoIndex) store() error { 56 payload, err := json.Marshal(reg.packages) 57 if err != nil { 58 return fmt.Errorf("cannot encode in json: %v", err) 59 } 60 61 err = os.WriteFile(reg.pathname, payload, 0755) 62 if err != nil { 63 return fmt.Errorf("cannot write registry file: %v", err) 64 } 65 66 return nil 67 } 68 69 func (reg *jsonRepoIndex) Add(pkg command.PackageManifest, repoDir string, pkgDirName string) error { 70 if err := reg.defaultRepoIndex.Add(pkg, repoDir, pkgDirName); err != nil { 71 return err 72 } 73 return reg.store() 74 } 75 76 func (reg *jsonRepoIndex) Remove(pkgName string, repoDir string) error { 77 if err := reg.defaultRepoIndex.Remove(pkgName, repoDir); err != nil { 78 return err 79 } 80 return reg.store() 81 } 82 83 func (reg *jsonRepoIndex) Update(pkg command.PackageManifest, repoDir string, pkgDirName string) error { 84 if err := reg.defaultRepoIndex.Update(pkg, repoDir, pkgDirName); err != nil { 85 return err 86 } 87 return reg.store() 88 }