diff --git a/state.go b/state.go index ce1ad5e..b6f19a3 100644 --- a/state.go +++ b/state.go @@ -2,6 +2,7 @@ package state import ( "encoding/json" + "errors" "fmt" "os" ) @@ -11,6 +12,7 @@ type StateStore interface { GetState(key string, object any) error } +// Locale Filesystem func NewLocaleFilesystem(path string) (StateStore, error) { l := localeFilesystem{} l.path = path @@ -56,3 +58,42 @@ func (s localeFilesystem) StoreState(key string, object any) error { return nil } + +// ROM +func NewRamFilesystem() (StateStore, error) { + l := ramFilesystem{} + l.data = make(map[string][]byte) + + return &l, nil +} + +type ramFilesystem struct { + data map[string][]byte +} + +func (s *ramFilesystem) GetState(key string, object any) error { + data, ok := s.data[key] + + if !ok { + return errors.New("cant get state from ram") + } + + err := json.Unmarshal(data, object) + + if err != nil { + return fmt.Errorf("%e: %v", ErrLocaleFilesystemCantReadState, err) + } + + return nil +} + +func (s *ramFilesystem) StoreState(key string, object any) error { + data, err := json.Marshal(object) + if err != nil { + return fmt.Errorf("%e: %v", ErrLocaleFilesystemCantStoreState, err) + } + + s.data[key] = data + + return nil +} diff --git a/state_test.go b/state_test.go index 01ab981..9390eb9 100644 --- a/state_test.go +++ b/state_test.go @@ -69,3 +69,48 @@ func TestStoreStateFromHDD(t *testing.T) { assert.Equal(t, result, data, "should get same data from hdd") } + +func TestRamState(t *testing.T) { + store, err := NewRamFilesystem() + assert.Nil(t, err, "should be able to create store without error") + + data := struct { + Name string + Test string `json:"-"` + Age int + something string + }{ + Name: "Max", + Test: "foo", + Age: 1337, + something: "nothing", + } + + dataFromStore := struct { + Name string + Test string `json:"-"` + Age int + something string + }{} + + result := struct { + Name string + Test string `json:"-"` + Age int + something string + }{ + Name: "Max", + Test: "", + Age: 1337, + something: "", + } + + err = store.StoreState("something", data) + assert.Nil(t, err, "should be save stater without error") + + err = store.GetState("something", &dataFromStore) + assert.Nil(t, err, "should be able to get data from stroe without error") + + assert.Equal(t, result, dataFromStore, "should get correct data from store") + +}