95 lines
2.8 KiB
Ruby
95 lines
2.8 KiB
Ruby
module Mercenary
|
|
class Presenter
|
|
attr_accessor :command
|
|
|
|
# Public: Make a new Presenter
|
|
#
|
|
# command - a Mercenary::Command to present
|
|
#
|
|
# Returns nothing
|
|
def initialize(command)
|
|
@command = command
|
|
end
|
|
|
|
# Public: Builds a string representation of the command usage
|
|
#
|
|
# Returns the string representation of the command usage
|
|
def usage_presentation
|
|
" #{command.syntax}"
|
|
end
|
|
|
|
# Public: Builds a string representation of the options
|
|
#
|
|
# Returns the string representation of the options
|
|
def options_presentation
|
|
return nil unless command_options_presentation || parent_command_options_presentation
|
|
[command_options_presentation, parent_command_options_presentation].compact.join("\n")
|
|
end
|
|
|
|
def command_options_presentation
|
|
return nil unless command.options.size > 0
|
|
command.options.map(&:to_s).join("\n")
|
|
end
|
|
|
|
# Public: Builds a string representation of the options for parent
|
|
# commands
|
|
#
|
|
# Returns the string representation of the options for parent commands
|
|
def parent_command_options_presentation
|
|
return nil unless command.parent
|
|
Presenter.new(command.parent).options_presentation
|
|
end
|
|
|
|
# Public: Builds a string representation of the subcommands
|
|
#
|
|
# Returns the string representation of the subcommands
|
|
def subcommands_presentation
|
|
return nil unless command.commands.size > 0
|
|
command.commands.values.uniq.map(&:summarize).join("\n")
|
|
end
|
|
|
|
# Public: Builds the command header, including the command identity and description
|
|
#
|
|
# Returns the command header as a String
|
|
def command_header
|
|
header = "#{command.identity}"
|
|
header << " -- #{command.description}" if command.description
|
|
header
|
|
end
|
|
|
|
# Public: Builds a string representation of the whole command
|
|
#
|
|
# Returns the string representation of the whole command
|
|
def command_presentation
|
|
msg = []
|
|
msg << command_header
|
|
msg << "Usage:"
|
|
msg << usage_presentation
|
|
|
|
if opts = options_presentation
|
|
msg << "Options:\n#{opts}"
|
|
end
|
|
if subcommands = subcommands_presentation
|
|
msg << "Subcommands:\n#{subcommands_presentation}"
|
|
end
|
|
msg.join("\n\n")
|
|
end
|
|
|
|
# Public: Turn a print_* into a *_presentation or freak out
|
|
#
|
|
# meth - the method being called
|
|
# args - an array of arguments passed to the missing method
|
|
# block - the block passed to the missing method
|
|
#
|
|
# Returns the value of whatever function is called
|
|
def method_missing(meth, *args, &block)
|
|
if meth.to_s =~ /^print_(.+)$/
|
|
send("#{$1.downcase}_presentation")
|
|
else
|
|
super # You *must* call super if you don't handle the method,
|
|
# otherwise you'll mess up Ruby's method lookup.
|
|
end
|
|
end
|
|
end
|
|
end
|