b5d4f547d2
Paying off some tech debt. Instead of relying ./kv.json existing, which is relative to the directory from which I start a program, I'm preferring that a consumer explicitly provides this path.
39 lines
971 B
Go
39 lines
971 B
Go
// Supporting reading and writing key-value pairs to disk.
|
|
package kv
|
|
|
|
import (
|
|
"encoding/json"
|
|
"io/ioutil"
|
|
"log"
|
|
"path"
|
|
)
|
|
|
|
// Return the decoded store from disk.
|
|
func getStore(storePath string) map[string]interface{} {
|
|
b, err := ioutil.ReadFile(path.Join(storePath, "kv.json"))
|
|
if err != nil {
|
|
log.Fatal("Could not read store: ", err)
|
|
}
|
|
var state map[string]interface{}
|
|
err = json.Unmarshal(b, &state)
|
|
if err != nil {
|
|
log.Fatal("Could not decode store as JSON: ", err)
|
|
}
|
|
return state
|
|
}
|
|
|
|
// Set `key` to `value` in the store.
|
|
func Set(storePath string, key string, value interface{}) error {
|
|
state := getStore(storePath)
|
|
state[key] = value
|
|
b, err := json.Marshal(state)
|
|
if err != nil {
|
|
log.Fatal("Could not encode state as JSON: ", err)
|
|
}
|
|
return ioutil.WriteFile(path.Join(storePath, "kv.json"), b, 0644)
|
|
}
|
|
|
|
// Get `key` from the store.
|
|
func Get(storePath string, key string) interface{} {
|
|
return getStore(path.Join(storePath, "kv.json"))[key]
|
|
}
|