class Samovar::Command
def self.[](*input, **options)
def self.[](*input, **options) self.new(input, **options) end
def self.append(row)
def self.append(row) attr_accessor(row.key) if row.respond_to?(:key) self.table << row end
def self.command_line(name)
def self.command_line(name) if table = self.table.merged "#{name} #{table.merged.usage}" else name end end
def self.many(*args, **options)
def self.many(*args, **options) append Many.new(*args, **options) end
def self.nested(*args, **options)
def self.nested(*args, **options) append Nested.new(*args, **options) end
def self.one(*args, **options)
def self.one(*args, **options) append One.new(*args, **options) end
def self.options(*args, **options, &block)
def self.options(*args, **options, &block) append Options.parse(*args, **options, &block) end
def self.parse(input = ARGV)
def self.parse(input = ARGV) self.new(input) rescue Error => error error.command.print_usage(output: $stderr) do |formatter| formatter.map(error) end return nil end
def self.split(*args, **options)
def self.split(*args, **options) append Split.new(*args, **options) end
def self.table
def self.table @table ||= Table.nested(self) end
def self.usage(rows, name)
def self.usage(rows, name) rows.nested(name, self) do |rows| return unless table = self.table.merged table.each do |row| if row.respond_to?(:usage) row.usage(rows) else rows << row end end end end
def [](*input)
def [](*input) self.dup.tap{|command| command.parse(input)} end
def initialize(input = nil, name: File.basename($0), parent: nil)
def initialize(input = nil, name: File.basename($0), parent: nil) @name = name @parent = parent parse(input) if input end
def parse(input)
def parse(input) self.class.table.merged.parse(input, self) if input.empty? return self else raise InvalidInputError.new(self, input) end end
def print_usage(output: $stderr, formatter: Output::UsageFormatter, &block)
def print_usage(output: $stderr, formatter: Output::UsageFormatter, &block) rows = Output::Rows.new self.class.usage(rows, @name) formatter.print(rows, output, &block) end