63 lines
1.2 KiB
Go
63 lines
1.2 KiB
Go
package persistence
|
|||
|
|
|
||
|
|
import (
|
||
|
|
"encoding/json"
|
||
|
|
"os"
|
||
|
|
|
||
|
|
"github.com/StevanFreeborn/term-tier/internal/core"
|
||
|
|
)
|
||
|
|
|
||
|
|
type FileSystem interface {
|
||
|
|
WriteFile(name string, data []byte, perm os.FileMode) error
|
||
|
|
ReadFile(name string) ([]byte, error)
|
||
|
|
}
|
||
|
|
|
||
|
|
type osFileSystem struct{}
|
||
|
|
|
||
|
|
func (osFileSystem) WriteFile(name string, data []byte, perm os.FileMode) error {
|
||
|
|
return os.WriteFile(name, data, perm)
|
||
|
|
}
|
||
|
|
|
||
|
|
func (osFileSystem) ReadFile(name string) ([]byte, error) {
|
||
|
|
return os.ReadFile(name)
|
||
|
|
}
|
||
|
|
|
||
|
|
type fileSaver struct {
|
||
|
|
fs FileSystem
|
||
|
|
}
|
||
|
|
|
||
|
|
func NewFileSaver() core.Saver {
|
||
|
|
return &fileSaver{
|
||
|
|
fs: osFileSystem{},
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func NewFileSaverWithFS(fs FileSystem) core.Saver {
|
||
|
|
return &fileSaver{
|
||
|
|
fs: fs,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func (s *fileSaver) Save(filename string, state core.SaveState) error {
|
||
|
|
data, err := json.MarshalIndent(state, "", " ")
|
||
|
|
if err != nil {
|
||
|
|
return err
|
||
|
|
}
|
||
|
|
|
||
|
|
return s.fs.WriteFile(filename, data, 0644)
|
||
|
|
}
|
||
|
|
|
||
|
|
func (s *fileSaver) Load(filename string) (core.SaveState, error) {
|
||
|
|
data, err := s.fs.ReadFile(filename)
|
||
|
|
if err != nil {
|
||
|
|
return core.SaveState{}, err
|
||
|
|
}
|
||
|
|
|
||
|
|
var state core.SaveState
|
||
|
|
if err := json.Unmarshal(data, &state); err != nil {
|
||
|
|
return core.SaveState{}, err
|
||
|
|
}
|
||
|
|
|
||
|
|
return state, nil
|
||
|
|
}
|