]> git.saurik.com Git - redis.git/blobdiff - src/redis-cli.c
Refactor help-related code into redis-cli.c
[redis.git] / src / redis-cli.c
index eef5ad1e07f7776618842d98af0a6a96944cb819..865f093135550fdd8b7c36fe4214e87e90af95cd 100644 (file)
@@ -44,6 +44,7 @@
 #include "sds.h"
 #include "zmalloc.h"
 #include "linenoise.h"
+#include "help.h"
 
 #define REDIS_NOTUSED(V) ((void) V)
 
@@ -83,6 +84,65 @@ static long long mstime(void) {
     return mst;
 }
 
+/*------------------------------------------------------------------------------
+ * Help functions
+ *--------------------------------------------------------------------------- */
+
+/* Output command help to stdout. */
+static void outputCommandHelp(struct commandHelp *help) {
+    printf("\n  \x1b[1m%s\x1b[0m \x1b[90m%s\x1b[0m\n", help->name, help->params);
+    printf("  \x1b[33msummary:\x1b[0m %s\n", help->summary);
+    printf("  \x1b[33msince:\x1b[0m %s\n", help->since);
+    printf("  \x1b[33mgroup:\x1b[0m %s\n", commandGroups[help->group]);
+}
+
+/* Return command group type by name string. */
+static int commandGroupIndex(const char *name) {
+    int i, len = sizeof(commandGroups)/sizeof(char*);
+    for (i = 0; i < len; i++)
+        if (strcasecmp(name, commandGroups[i]) == 0)
+            return i;
+    return -1;
+}
+
+/* Output group names. */
+static void outputGroupHelp() {
+    int i, len = sizeof(commandGroups)/sizeof(char*);
+    for (i = 0; i < len; i++)
+        printf("  \x1b[90m-\x1b[0m %s\n", commandGroups[i]);
+}
+
+/* Output all command help, filtering by group or command name. */
+static void outputHelp(int argc, char **argv) {
+    int i, len = sizeof(commandHelp) / sizeof(struct commandHelp);
+    int group;
+    struct commandHelp *help;
+
+    if (argc && strcasecmp("groups", argv[0]) == 0) {
+        outputGroupHelp();
+        return;
+    }
+
+    group = argc ? commandGroupIndex(argv[0]) : -1;
+    for (i = 0; i < len; i++) {
+        help = &commandHelp[i];
+        if (group == -1) {
+            if (argc) {
+                if (strcasecmp(help->name, argv[0]) == 0) {
+                    outputCommandHelp(help);
+                }
+            } else {
+                outputCommandHelp(help);
+            }
+        } else {
+            if (group == help->group) {
+                outputCommandHelp(help);
+            }
+        }
+    }
+    puts("");
+}
+
 /*------------------------------------------------------------------------------
  * Networking / parsing
  *--------------------------------------------------------------------------- */
@@ -252,22 +312,6 @@ static int cliReadReply() {
     return REDIS_OK;
 }
 
-static void showInteractiveHelp(void) {
-    printf(
-    "\n"
-    "Welcome to redis-cli " REDIS_VERSION "!\n"
-    "Just type any valid Redis command to see a pretty printed output.\n"
-    "\n"
-    "It is possible to quote strings, like in:\n"
-    "  set \"my key\" \"some string \\xff\\n\"\n"
-    "\n"
-    "You can find a list of valid Redis commands at\n"
-    "  http://code.google.com/p/redis/wiki/CommandReference\n"
-    "\n"
-    "Note: redis-cli supports line editing, use up/down arrows for history."
-    "\n\n");
-}
-
 static int cliSendCommand(int argc, char **argv, int repeat) {
     char *command = argv[0];
     size_t *argvlen;
@@ -275,7 +319,7 @@ static int cliSendCommand(int argc, char **argv, int repeat) {
 
     config.raw_output = !strcasecmp(command,"info");
     if (!strcasecmp(command,"help")) {
-        showInteractiveHelp();
+        outputHelp(--argc, ++argv);
         return REDIS_OK;
     }
     if (!strcasecmp(command,"shutdown")) config.shutdown = 1;