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:
parent
7f8a5176ce
commit
ec4c8472ca
2 changed files with 51 additions and 0 deletions
11
gopkgs/kv/default.nix
Normal file
11
gopkgs/kv/default.nix
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
{
|
||||||
|
depot ? import <depot> {},
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
depot.buildGo.package {
|
||||||
|
name = "kv";
|
||||||
|
srcs = [
|
||||||
|
./kv.go
|
||||||
|
];
|
||||||
|
}
|
40
gopkgs/kv/kv.go
Normal file
40
gopkgs/kv/kv.go
Normal 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]
|
||||||
|
}
|
Loading…
Reference in a new issue