class Samovar::Command
def self.[](*input, **options)
def self.[](*input, **options) self.new(input, **options) end
def self.append(row)
def self.append(row) if method_defined?(row.key, false) warning "Method for key #{row.key} is already defined!", caller # raise ArgumentError, "Method for key #{row.key} is already defined!" end attr_accessor(row.key) if row.respond_to?(:key) self.table << row end
def self.call(input = ARGV)
def self.call(input = ARGV) if command = self.parse(input) command.call end 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(*arguments, **options)
def self.many(*arguments, **options) append Many.new(*arguments, **options) end
def self.nested(*arguments, **options)
def self.nested(*arguments, **options) append Nested.new(*arguments, **options) end
def self.one(*arguments, **options)
def self.one(*arguments, **options) append One.new(*arguments, **options) end
def self.options(*arguments, **options, &block)
def self.options(*arguments, **options, &block) append Options.parse(*arguments, **options, &block) end
def self.parse(input)
def self.parse(input) self.new(input) rescue Error => error error.command.print_usage(output: $stderr) do |formatter| formatter.map(error) end return nil end
def self.split(*arguments, **options)
def self.split(*arguments, **options) append Split.new(*arguments, **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, output: nil)
def initialize(input = nil, name: File.basename($0), parent: nil, output: nil) @name = name @parent = parent @output = output parse(input) if input end
def output
def output @output || $stdout 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: self.output, formatter: Output::UsageFormatter, &block)
def print_usage(output: self.output, formatter: Output::UsageFormatter, &block) rows = Output::Rows.new self.class.usage(rows, @name) formatter.print(rows, output, &block) end
def to_s
def to_s self.class.name end