go-ml-dev/iokit

View on GitHub
cache.go

Summary

Maintainability
A
0 mins
Test Coverage
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}
}