package types import ( "bytes" "github.com/BurntSushi/toml" "os" ) const SchemaVersion = 1 type Package struct { GoPackagePath string `toml:"-"` Version string `toml:"version"` Hash string `toml:"hash"` ReplacedPath string `toml:"replaced,omitempty"` } type Output struct { SchemaVersion int `toml:"schema"` Mod map[string]*Package `toml:"mod"` } func Marshal(pkgs []*Package) ([]byte, error) { out := &Output{ SchemaVersion: SchemaVersion, Mod: make(map[string]*Package), } for _, pkg := range pkgs { out.Mod[pkg.GoPackagePath] = pkg } var buf bytes.Buffer e := toml.NewEncoder(&buf) err := e.Encode(out) if err != nil { return nil, err } return buf.Bytes(), nil } func ReadCache(filePath string) map[string]*Package { ret := make(map[string]*Package) if filePath == "" { return ret } b, err := os.ReadFile(filePath) if err != nil { return ret } var output Output _, err = toml.Decode(string(b), &output) if err != nil { return ret } if output.SchemaVersion != SchemaVersion { return ret } for k, v := range output.Mod { v.GoPackagePath = k ret[k] = v } return ret }