about summary refs log tree commit diff
path: root/gopkgs/kv
diff options
context:
space:
mode:
authorWilliam Carroll <wpcarro@gmail.com>2020-02-09T13·41+0000
committerWilliam Carroll <wpcarro@gmail.com>2020-02-10T10·06+0000
commitec4c8472ca8eaed9a40d5decf5f909bdda96ec62 (patch)
tree89e21d88c3f24c39e05cbd5b1ff1f6d0404a103e /gopkgs/kv
parent7f8a5176ce4bebfb01fa5333791c8f14ad8cef45 (diff)
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)
Diffstat (limited to 'gopkgs/kv')
-rw-r--r--gopkgs/kv/default.nix11
-rw-r--r--gopkgs/kv/kv.go40
2 files changed, 51 insertions, 0 deletions
diff --git a/gopkgs/kv/default.nix b/gopkgs/kv/default.nix
new file mode 100644
index 000000000000..1d54ecc350df
--- /dev/null
+++ b/gopkgs/kv/default.nix
@@ -0,0 +1,11 @@
+{
+  depot ? import <depot> {},
+  ...
+}:
+
+depot.buildGo.package {
+  name = "kv";
+  srcs = [
+    ./kv.go
+  ];
+}
diff --git a/gopkgs/kv/kv.go b/gopkgs/kv/kv.go
new file mode 100644
index 000000000000..072f000eb2f0
--- /dev/null
+++ b/gopkgs/kv/kv.go
@@ -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]
+}