Support simple key-value store

In order to persist my access and refresh tokens, I needed a store. I think
using a database like SQLite may have been fine for this but was heavier weight
than what I wanted.

I decided to write a simple key-value store when the state is encoded and JSON
in a file called kv.json.

TODO:
- Support field nesting
- Support better error handling
- Support parameterizing the store path (i.e. ./kv.json)
This commit is contained in:
William Carroll 2020-02-09 13:41:27 +00:00
parent 7f8a5176ce
commit ec4c8472ca
2 changed files with 51 additions and 0 deletions

11
gopkgs/kv/default.nix Normal file
View file

@ -0,0 +1,11 @@
{
depot ? import <depot> {},
...
}:
depot.buildGo.package {
name = "kv";
srcs = [
./kv.go
];
}

40
gopkgs/kv/kv.go Normal file
View file

@ -0,0 +1,40 @@
// Supporting reading and writing key-value pairs to disk.
package kv
import (
"encoding/json"
"io/ioutil"
"log"
)
const storePath = "./kv.json"
// Return the decoded store from disk.
func getStore() map[string]interface{} {
b, err := ioutil.ReadFile(storePath)
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(key string, value interface{}) error {
state := getStore()
state[key] = value
b, err := json.Marshal(state)
if err != nil {
log.Fatal("Could not encode state as JSON: ", err)
}
return ioutil.WriteFile(storePath, b, 0644)
}
// Get `key` from the store.
func Get(key string) interface{} {
return getStore()[key]
}