cache.go
package iokit
import (
"go-ml.dev/pkg/iokit/fu"
"io"
"os"
"os/user"
"path"
"path/filepath"
)
const cacheGoFp = ".cache/gofper"
var FullCacheDir string
func init() {
homedir, _ := os.LookupEnv("HOME")
usr, err := user.Current()
if err == nil {
homedir = usr.HomeDir
}
if homedir == "" {
homedir = "/tmp"
}
FullCacheDir, _ = filepath.Abs(filepath.Join(homedir, cacheGoFp))
}
func CacheDir(d string) string {
r := fu.Ifes(filepath.IsAbs(d), d, path.Join(FullCacheDir, d))
_ = os.MkdirAll(r, 0777)
return r
}
func CacheFile(f string) string {
r := fu.Ifes(filepath.IsAbs(f), f, path.Join(FullCacheDir, f))
_ = os.MkdirAll(path.Dir(r), 0777)
return r
}
type Cache string
func (c Cache) File() InputOutput {
return File(CacheFile(string(c)))
}
func (c Cache) String() string {
return CacheFile(string(c))
}
func (c Cache) Remove() (err error) {
s := CacheFile(string(c))
_, err = os.Stat(s)
if err == nil {
return os.Remove(s)
}
return nil
}
func (c Cache) Defined() bool {
return string(c) != ""
}
func (c Cache) Exists() bool {
if c.Defined() {
if st, err := os.Stat(c.Path()); err == nil && st.Mode().IsRegular() {
return true
}
}
return false
}
func (c Cache) Path() string {
return CacheFile(string(c))
}
func (c Cache) Open() (io.ReadCloser, error) {
return File(c.Path()).Open()
}
func (c Cache) LuckyOpen() LuckyReader {
rd, err := c.Open()
if err != nil {
panic(err)
}
return LuckyReader{rd}
}