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…
	
	Add table
		Add a link
		
	
		Reference in a new issue