54 lines
817 B
Go
54 lines
817 B
Go
package storage
|
|
|
|
import (
|
|
"encoding/json"
|
|
"os"
|
|
"sync"
|
|
)
|
|
|
|
type Storage[T any] struct {
|
|
path string
|
|
mu sync.RWMutex
|
|
Data *T
|
|
}
|
|
|
|
func NewJsonStorage[T any](path string, defaultData *T) *Storage[T] {
|
|
return &Storage[T]{
|
|
path: path,
|
|
Data: defaultData,
|
|
}
|
|
}
|
|
|
|
func (s *Storage[T]) Save() error {
|
|
s.mu.Lock()
|
|
defer s.mu.Unlock()
|
|
|
|
data, err := json.MarshalIndent(s.Data, "", " ")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return os.WriteFile(s.path, data, 0644)
|
|
}
|
|
|
|
func (s *Storage[T]) Load() error {
|
|
s.mu.Lock()
|
|
defer s.mu.Unlock()
|
|
|
|
bytes, err := os.ReadFile(s.path)
|
|
if err != nil {
|
|
if os.IsNotExist(err) {
|
|
return nil
|
|
}
|
|
return err
|
|
}
|
|
|
|
return json.Unmarshal(bytes, s.Data)
|
|
}
|
|
|
|
func (s *Storage[T]) Init() error {
|
|
if _, err := os.Stat(s.path); os.IsNotExist(err) {
|
|
return s.Save()
|
|
}
|
|
return s.Load()
|
|
} |