Implement 'get' and 'get keys' -SDL CLI commands
[ric-plt/sdlgo.git] / internal / cli / keys.go
diff --git a/internal/cli/keys.go b/internal/cli/keys.go
new file mode 100644 (file)
index 0000000..33dce25
--- /dev/null
@@ -0,0 +1,98 @@
+/*
+   Copyright (c) 2021 AT&T Intellectual Property.
+   Copyright (c) 2018-2021 Nokia.
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+*/
+
+/*
+ * This source code is part of the near-RT RIC (RAN Intelligent Controller)
+ * platform project (RICP).
+ */
+
+package cli
+
+import (
+       "fmt"
+       "os"
+       "sort"
+
+       "gerrit.o-ran-sc.org/r/ric-plt/sdlgo"
+       "gerrit.o-ran-sc.org/r/ric-plt/sdlgo/internal/sdlgoredis"
+       "github.com/spf13/cobra"
+)
+
+func init() {
+       getCmd.AddCommand(newKeysCmd(func() ISyncStorage {
+               return sdlgo.NewSyncStorage()
+       }))
+}
+
+var (
+       keysLong = `List keys in the given namespace matching key search pattern.`
+
+       keysExample = `  # List all keys in the given namespace.
+  sdlcli get keys sdlns
+  # List keys in the given namespace matching given key search pattern.
+  sdlcli get keys sdlns 'he*'
+
+  Supported search glob-style patterns:
+    h?llo matches hello, hallo and hxllo
+    h*llo matches hllo and heeeello
+    h[ae]llo matches hello and hallo, but not hillo
+    h[^e]llo matches hallo, hbllo, ... but not hello
+    h[a-b]llo matches hallo and hbllo
+
+  The \ escapes character in key search pattern and those will be treated as a normal
+  character:
+    h\[?llo\* matches h[ello* and h[allo*`
+)
+
+func newKeysCmd(sdlCb SyncStorageCreateCb) *cobra.Command {
+       return &cobra.Command{
+               Use:     "keys <namespace> [pattern|default '*']",
+               Short:   "List keys in the given namespace matching key search pattern",
+               Long:    keysLong,
+               Example: keysExample,
+               Args:    cobra.RangeArgs(1, 2),
+               RunE: func(cmd *cobra.Command, args []string) error {
+                       sdlgoredis.SetDbLogger(&buf)
+                       keysArgs := newKeysArgs(args[0], "*")
+                       if len(args) > 1 {
+                               keysArgs.pattern = args[1]
+                       }
+                       keys, err := runListKeys(sdlCb, keysArgs)
+                       if err != nil {
+                               fmt.Fprintf(os.Stderr, "%s", buf.String())
+                               return err
+                       }
+                       printKeys(cmd, keys)
+                       return nil
+               },
+       }
+}
+
+func runListKeys(sdlCb SyncStorageCreateCb, args keysArgs) ([]string, error) {
+       keys, err := sdlCb().ListKeys(args.ns, args.pattern)
+       if err != nil {
+               return nil, err
+       }
+       sort.Strings(keys)
+       return keys, err
+}
+
+func printKeys(cmd *cobra.Command, keys []string) {
+       for _, k := range keys {
+               cmd.Println(k)
+       }
+}