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 &reg, 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  }