matterbridge/vendor/github.com/keybase/go-keybase-chat-bot/kbchat/kvstore.go

229 lines
6.3 KiB
Go
Raw Permalink Normal View History

package kbchat
import (
"encoding/json"
"strings"
"github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1"
)
type kvstoreMethod string
type kvstoreOptions struct {
Team *string `json:"team"`
Namespace *string `json:"namespace,omitempty"`
EntryKey *string `json:"entryKey,omitempty"`
EntryValue *string `json:"entryValue,omitempty"`
Revision *int `json:"revision,omitempty"`
}
type kvstoreParams struct {
Options kvstoreOptions `json:"options"`
}
type kvstoreAPIReq struct {
Method kvstoreMethod `json:"method"`
Params kvstoreParams `json:"params"`
}
type GetEntryRes struct {
Result keybase1.KVGetResult `json:"result"`
Error Error `json:"error,omitempty"`
}
type PutEntryRes struct {
Result keybase1.KVPutResult `json:"result"`
Error Error `json:"error,omitempty"`
}
type DeleteEntryRes struct {
Result keybase1.KVDeleteEntryResult `json:"result"`
Error Error `json:"error,omitempty"`
}
type ListNamespacesRes struct {
Result keybase1.KVListNamespaceResult `json:"result"`
Error Error `json:"error,omitempty"`
}
type ListEntryKeysRes struct {
Result keybase1.KVListEntryResult `json:"result"`
Error Error `json:"error,omitempty"`
}
type KVStoreAPI interface {
PutEntry(teamName *string, namespace string, entryKey string, entryValue string) (keybase1.KVPutResult, error)
PutEntryWithRevision(teamName *string, namespace string, entryKey string, entryValue string, revision int) (keybase1.KVPutResult, error)
DeleteEntry(teamName *string, namespace string, entryKey string) (keybase1.KVDeleteEntryResult, error)
DeleteEntryWithRevision(teamName *string, namespace string, entryKey string, revision int) (keybase1.KVDeleteEntryResult, error)
GetEntry(teamName *string, namespace string, entryKey string) (keybase1.KVGetResult, error)
ListNamespaces(teamName *string) (keybase1.KVListNamespaceResult, error)
ListEntryKeys(teamName *string, namespace string) (keybase1.KVListEntryResult, error)
}
func (a *API) PutEntry(teamName *string, namespace string, entryKey string, entryValue string) (result keybase1.KVPutResult, err error) {
return a.PutEntryWithRevision(teamName, namespace, entryKey, entryValue, 0)
}
func (a *API) PutEntryWithRevision(teamName *string, namespace string, entryKey string, entryValue string, revision int) (result keybase1.KVPutResult, err error) {
opts := kvstoreOptions{
Team: teamName,
Namespace: &namespace,
EntryKey: &entryKey,
EntryValue: &entryValue,
}
if revision != 0 {
opts.Revision = &revision
}
args := kvstoreAPIReq{Method: "put", Params: kvstoreParams{Options: opts}}
apiInput, err := json.Marshal(args)
if err != nil {
return result, err
}
cmd := a.runOpts.Command("kvstore", "api")
cmd.Stdin = strings.NewReader(string(apiInput))
bytes, err := cmd.Output()
if err != nil {
return result, APIError{err}
}
entry := PutEntryRes{}
err = json.Unmarshal(bytes, &entry)
if err != nil {
return result, UnmarshalError{err}
}
if entry.Error.Message != "" {
return result, entry.Error
}
return entry.Result, nil
}
func (a *API) DeleteEntry(teamName *string, namespace string, entryKey string) (result keybase1.KVDeleteEntryResult, err error) {
return a.DeleteEntryWithRevision(teamName, namespace, entryKey, 0)
}
func (a *API) DeleteEntryWithRevision(teamName *string, namespace string, entryKey string, revision int) (result keybase1.KVDeleteEntryResult, err error) {
opts := kvstoreOptions{
Team: teamName,
Namespace: &namespace,
EntryKey: &entryKey,
}
if revision != 0 {
opts.Revision = &revision
}
args := kvstoreAPIReq{Method: "del", Params: kvstoreParams{Options: opts}}
apiInput, err := json.Marshal(args)
if err != nil {
return result, err
}
cmd := a.runOpts.Command("kvstore", "api")
cmd.Stdin = strings.NewReader(string(apiInput))
bytes, err := cmd.Output()
if err != nil {
return result, APIError{err}
}
entry := DeleteEntryRes{}
err = json.Unmarshal(bytes, &entry)
if err != nil {
return result, UnmarshalError{err}
}
if entry.Error.Message != "" {
return result, entry.Error
}
return entry.Result, nil
}
func (a *API) GetEntry(teamName *string, namespace string, entryKey string) (result keybase1.KVGetResult, err error) {
opts := kvstoreOptions{
Team: teamName,
Namespace: &namespace,
EntryKey: &entryKey,
}
args := kvstoreAPIReq{Method: "get", Params: kvstoreParams{Options: opts}}
apiInput, err := json.Marshal(args)
if err != nil {
return result, err
}
cmd := a.runOpts.Command("kvstore", "api")
cmd.Stdin = strings.NewReader(string(apiInput))
bytes, err := cmd.Output()
if err != nil {
return result, APIError{err}
}
entry := GetEntryRes{}
err = json.Unmarshal(bytes, &entry)
if err != nil {
return result, UnmarshalError{err}
}
if entry.Error.Message != "" {
return result, entry.Error
}
return entry.Result, nil
}
func (a *API) ListNamespaces(teamName *string) (result keybase1.KVListNamespaceResult, err error) {
opts := kvstoreOptions{
Team: teamName,
}
args := kvstoreAPIReq{Method: "list", Params: kvstoreParams{Options: opts}}
apiInput, err := json.Marshal(args)
if err != nil {
return result, err
}
cmd := a.runOpts.Command("kvstore", "api")
cmd.Stdin = strings.NewReader(string(apiInput))
bytes, err := cmd.Output()
if err != nil {
return result, APIError{err}
}
var namespaces ListNamespacesRes
err = json.Unmarshal(bytes, &namespaces)
if err != nil {
return result, UnmarshalError{err}
}
if namespaces.Error.Message != "" {
return result, namespaces.Error
}
return namespaces.Result, nil
}
func (a *API) ListEntryKeys(teamName *string, namespace string) (result keybase1.KVListEntryResult, err error) {
opts := kvstoreOptions{
Team: teamName,
Namespace: &namespace,
}
args := kvstoreAPIReq{Method: "list", Params: kvstoreParams{Options: opts}}
apiInput, err := json.Marshal(args)
if err != nil {
return result, err
}
cmd := a.runOpts.Command("kvstore", "api")
cmd.Stdin = strings.NewReader(string(apiInput))
bytes, err := cmd.Output()
if err != nil {
return result, APIError{err}
}
entryKeys := ListEntryKeysRes{}
err = json.Unmarshal(bytes, &entryKeys)
if err != nil {
return result, UnmarshalError{err}
}
if entryKeys.Error.Message != "" {
return result, entryKeys.Error
}
return entryKeys.Result, nil
}