feat: storage sync/async funcs

This commit is contained in:
Ilia Denisov
2026-03-14 21:57:25 +02:00
parent 70a43237ca
commit 2134386625
3 changed files with 45 additions and 6 deletions
+9 -5
View File
@@ -102,7 +102,7 @@ func NewFS(storageRoot string) (*fsStorage, error) {
func (s *fsStorage) StateExistsAsync(callback func(bool, error)) { func (s *fsStorage) StateExistsAsync(callback func(bool, error)) {
go func() { go func() {
exists, err := s.FileExists(stateFileName) exists, err := s.StateExists()
if callback != nil { if callback != nil {
callback(exists, err) callback(exists, err)
} }
@@ -111,7 +111,7 @@ func (s *fsStorage) StateExistsAsync(callback func(bool, error)) {
func (s *fsStorage) LoadStateAsync(callback func(client.State, error)) { func (s *fsStorage) LoadStateAsync(callback func(client.State, error)) {
go func() { go func() {
state, err := s.loadStateSync() state, err := s.LoadState()
if callback != nil { if callback != nil {
callback(state, err) callback(state, err)
} }
@@ -120,7 +120,7 @@ func (s *fsStorage) LoadStateAsync(callback func(client.State, error)) {
func (s *fsStorage) SaveStateAsync(state client.State, callback func(error)) { func (s *fsStorage) SaveStateAsync(state client.State, callback func(error)) {
go func() { go func() {
err := s.saveStateSync(state) err := s.SaveState(state)
if callback != nil { if callback != nil {
callback(err) callback(err)
} }
@@ -253,7 +253,11 @@ func (s *fsStorage) ListFiles() ([]string, error) {
return files, nil return files, nil
} }
func (s *fsStorage) loadStateSync() (client.State, error) { func (s *fsStorage) StateExists() (bool, error) {
return s.FileExists(stateFileName)
}
func (s *fsStorage) LoadState() (client.State, error) {
data, err := s.ReadFile(stateFileName) data, err := s.ReadFile(stateFileName)
if err != nil { if err != nil {
return client.State{}, err return client.State{}, err
@@ -261,7 +265,7 @@ func (s *fsStorage) loadStateSync() (client.State, error) {
return unmarshalState(data) return unmarshalState(data)
} }
func (s *fsStorage) saveStateSync(state client.State) error { func (s *fsStorage) SaveState(state client.State) error {
data, err := marshalState(state) data, err := marshalState(state)
if err != nil { if err != nil {
return err return err
+33
View File
@@ -22,6 +22,39 @@ type callbackResult[T any] struct {
err error err error
} }
func TestStateRoundTrip(t *testing.T) {
s := newTestStorage(t)
want := sampleState()
exists, err := s.StateExists()
if err != nil {
t.Fatalf("state exists before save: %v", err)
}
if exists {
t.Fatal("state file should not exist before save")
}
if err := s.SaveState(want); err != nil {
t.Fatalf("save state: %v", err)
}
exists, err = s.StateExists()
if err != nil {
t.Fatalf("state exists after save: %v", err)
}
if !exists {
t.Fatal("state file should exist after save")
}
got, err := s.LoadState()
if err != nil {
t.Fatalf("load state: %v", err)
}
if !reflect.DeepEqual(got, want) {
t.Fatalf("loaded state mismatch\nwant: %#v\ngot: %#v", want, got)
}
}
func TestStateRoundTripAsync(t *testing.T) { func TestStateRoundTripAsync(t *testing.T) {
s := newTestStorage(t) s := newTestStorage(t)
want := sampleState() want := sampleState()
+3 -1
View File
@@ -14,7 +14,9 @@ type Storage interface {
DeleteFile(string) error DeleteFile(string) error
ListFiles() ([]string, error) ListFiles() ([]string, error)
// StateExistss() (bool, error) StateExists() (bool, error)
LoadState() (client.State, error)
SaveState(client.State) error
} }
// UIStorage manages Client's data local storing and retrieval. // UIStorage manages Client's data local storing and retrieval.