1#!/usr/bin/env ruby
2
3GROUPS = [
4  "generic",
5  "string",
6  "list",
7  "set",
8  "sorted_set",
9  "hash",
10  "pubsub",
11  "transactions",
12  "connection",
13  "server",
14  "scripting"
15].freeze
16
17GROUPS_BY_NAME = Hash[*
18  GROUPS.each_with_index.map do |n,i|
19    [n,i]
20  end.flatten
21].freeze
22
23def argument arg
24  name = arg["name"].is_a?(Array) ? arg["name"].join(" ") : arg["name"]
25  name = arg["enum"].join "|" if "enum" == arg["type"]
26  name = arg["command"] + " " + name if arg["command"]
27  if arg["multiple"]
28    name = "#{name} [#{name} ...]"
29  end
30  if arg["optional"]
31    name = "[#{name}]"
32  end
33  name
34end
35
36def arguments command
37  return "-" unless command["arguments"]
38  command["arguments"].map do |arg|
39    argument arg
40  end.join " "
41end
42
43def commands
44  return @commands if @commands
45
46  require "rubygems"
47  require "net/http"
48  require "net/https"
49  require "json"
50  require "uri"
51
52  url = URI.parse "https://raw.github.com/antirez/redis-doc/master/commands.json"
53  client = Net::HTTP.new url.host, url.port
54  client.use_ssl = true
55  response = client.get url.path
56  if response.is_a?(Net::HTTPSuccess)
57    @commands = JSON.parse(response.body)
58  else
59    response.error!
60  end
61end
62
63def generate_groups
64  GROUPS.map do |n|
65    "\"#{n}\""
66  end.join(",\n    ");
67end
68
69def generate_commands
70  commands.to_a.sort do |x,y|
71    x[0] <=> y[0]
72  end.map do |key, command|
73    group = GROUPS_BY_NAME[command["group"]]
74    if group.nil?
75      STDERR.puts "Please update groups array in #{__FILE__}"
76      raise "Unknown group #{command["group"]}"
77    end
78
79    ret = <<-SPEC
80{ "#{key}",
81    "#{arguments(command)}",
82    "#{command["summary"]}",
83    #{group},
84    "#{command["since"]}" }
85    SPEC
86    ret.strip
87  end.join(",\n    ")
88end
89
90# Write to stdout
91puts <<-HELP_H
92/* Automatically generated by #{__FILE__}, do not edit. */
93
94#ifndef __REDIS_HELP_H
95#define __REDIS_HELP_H
96
97static char *commandGroups[] = {
98    #{generate_groups}
99};
100
101struct commandHelp {
102  char *name;
103  char *params;
104  char *summary;
105  int group;
106  char *since;
107} commandHelp[] = {
108    #{generate_commands}
109};
110
111#endif
112HELP_H
113
114