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