79 lines
1.4 KiB
Go
79 lines
1.4 KiB
Go
package cache
|
|
|
|
import (
|
|
"encoding/json"
|
|
"os"
|
|
"sync"
|
|
)
|
|
|
|
type Cache interface {
|
|
Get(key string) (any, bool)
|
|
GetDefault(key string, defaultValue any) (any, error)
|
|
Set(key string, val any) error
|
|
Iteration(func(key string, val any))
|
|
}
|
|
|
|
type cache struct {
|
|
filename string
|
|
data map[string]any
|
|
mu sync.Mutex
|
|
}
|
|
|
|
func (c *cache) Get(key string) (any, bool) {
|
|
c.mu.Lock()
|
|
defer c.mu.Unlock()
|
|
|
|
val, ok := c.data[key]
|
|
return val, ok
|
|
}
|
|
|
|
func (c *cache) GetDefault(key string, defaultVal any) (any, error) {
|
|
c.mu.Lock()
|
|
defer c.mu.Unlock()
|
|
val, ok := c.data[key]
|
|
if ok {
|
|
return val, nil
|
|
}
|
|
|
|
c.data[key] = defaultVal
|
|
bytes, err := json.Marshal(c.data)
|
|
if err != nil {
|
|
return defaultVal, err
|
|
}
|
|
err = os.WriteFile(c.filename, bytes, 0666)
|
|
|
|
return defaultVal, err
|
|
}
|
|
|
|
func (c *cache) Set(key string, val any) error {
|
|
c.mu.Lock()
|
|
defer c.mu.Unlock()
|
|
c.data[key] = val
|
|
bytes, err := json.Marshal(c.data)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return os.WriteFile(c.filename, bytes, 0666)
|
|
}
|
|
|
|
func (c *cache) Iteration(f func(key string, val any)) {
|
|
for k, v := range c.data {
|
|
f(k, v)
|
|
}
|
|
}
|
|
|
|
func NewCache(filename string) (Cache, error) {
|
|
var c = &cache{
|
|
filename: filename,
|
|
data: make(map[string]any),
|
|
}
|
|
bytes, err := os.ReadFile(filename)
|
|
if err != nil {
|
|
return c, nil
|
|
}
|
|
if err = json.Unmarshal(bytes, &c.data); err != nil {
|
|
return c, err
|
|
}
|
|
return c, nil
|
|
}
|