summaryrefslogtreecommitdiff
path: root/lib/lib_ext/gli.rb
blob: f9b03be140613c128498368a09a6739239deedfd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#
# print subcommands indented in the main global help screen
#

module GLI
  module Commands
    module HelpModules
      class GlobalHelpFormat
        SUB_CMD_INDENT = "  "
        def format
          program_desc = @app.program_desc
          program_long_desc = @app.program_long_desc
          if program_long_desc
            wrapper = @wrapper_class.new(Terminal.instance.size[0],4)
            program_long_desc = "\n    #{wrapper.wrap(program_long_desc)}\n\n" if program_long_desc
          else
            program_long_desc = "\n"
          end

          # build a list of commands, sort them so the commands with subcommands are at the bottom
          commands = @sorter.call(@app.commands_declaration_order.reject(&:nodoc)).sort do |a,b|
            if a.commands.any? && b.commands.any?;  a.name.to_s <=> b.name.to_s
            elsif a.commands.any?;                  1
            elsif b.commands.any?;                 -1
            else;                                   a.name.to_s <=> b.name.to_s
            end
          end

          # build a list of command info ([name, description]), including subcommands if appropriate
          command_info_list = []
          commands.each do |command|
            name = [command.name, Array(command.aliases)].flatten.join(', ')
            command_info_list << [name, command.description]
            if command.commands.any?
              @sorter.call(command.commands_declaration_order).each do |cmd|
                command_info_list << [SUB_CMD_INDENT + command.name.to_s + " " + cmd.names, cmd.description + (command.get_default_command == cmd.name ? " (default)" : "")]
              end
            end
          end

          # display
          command_formatter = ListFormatter.new(command_info_list, @wrapper_class)
          stringio = StringIO.new
          command_formatter.output(stringio)
          commands = stringio.string
          global_option_descriptions = OptionsFormatter.new(global_flags_and_switches, @sorter, @wrapper_class).format
          GLOBAL_HELP.result(binding)
        end
      end
    end
  end
end