add k/v store
This commit is contained in:
		
							
								
								
									
										68
									
								
								store/store.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								store/store.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,68 @@ | ||||
| // Package store implements a synchronous in-memory K/V store | ||||
| // fronted by an HTTP server. | ||||
| package store | ||||
|  | ||||
| import ( | ||||
| 	"io" | ||||
| 	"net/http" | ||||
| 	"sync" | ||||
| ) | ||||
|  | ||||
| type Map struct { | ||||
| 	m sync.Map | ||||
| } | ||||
|  | ||||
| func New(from map[string]string) *Map { | ||||
| 	var m Map | ||||
| 	for k, v := range from { | ||||
| 		m.Set(k, v) | ||||
| 	} | ||||
| 	return &m | ||||
| } | ||||
|  | ||||
| func (m *Map) Get(k string) (string, bool) { | ||||
| 	r, ok := m.m.Load(k) | ||||
| 	return r.(string), ok | ||||
| } | ||||
|  | ||||
| func (m *Map) Set(k, v string) { | ||||
| 	m.m.Store(k, v) | ||||
| } | ||||
|  | ||||
| func (m *Map) Delete(k string) { | ||||
| 	m.m.Delete(k) | ||||
| } | ||||
|  | ||||
| func (m *Map) Router() http.Handler { | ||||
| 	r := http.NewServeMux() | ||||
| 	r.HandleFunc("GET /{key}", m.get) | ||||
| 	r.HandleFunc("PUT /{key}", m.set) | ||||
| 	r.HandleFunc("POST /{key}", m.set) | ||||
| 	r.HandleFunc("DELETE /{key}", m.delete) | ||||
| 	return r | ||||
| } | ||||
|  | ||||
| func (m *Map) get(w http.ResponseWriter, r *http.Request) { | ||||
| 	k := r.PathValue("key") | ||||
| 	v, ok := m.Get(k) | ||||
| 	if !ok { | ||||
| 		http.Error(w, "not found", http.StatusNotFound) | ||||
| 	} | ||||
| 	io.WriteString(w, v) | ||||
| } | ||||
|  | ||||
| func (m *Map) set(w http.ResponseWriter, r *http.Request) { | ||||
| 	k := r.PathValue("key") | ||||
| 	b, err := io.ReadAll(r.Body) | ||||
| 	if err != nil { | ||||
| 		http.Error(w, err.Error(), http.StatusBadRequest) | ||||
| 	} | ||||
| 	m.Set(k, string(b)) | ||||
| 	w.WriteHeader(http.StatusNoContent) | ||||
| } | ||||
|  | ||||
| func (m *Map) delete(w http.ResponseWriter, r *http.Request) { | ||||
| 	k := r.PathValue("key") | ||||
| 	m.Delete(k) | ||||
| 	w.WriteHeader(http.StatusNoContent) | ||||
| } | ||||
		Reference in New Issue
	
	Block a user