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]
 | 
						|
}
 |