class OptParseGen::ScoptParser

Public Class Methods

new(input) click to toggle source
# File lib/optparsegen/scopt.rb, line 2
def initialize(input)
  @tape = input
  @options = []
  @current = OptParseGen::Option.new
end

Public Instance Methods

parse() click to toggle source
# File lib/optparsegen/scopt.rb, line 8
def parse
  state = :parse_any

  while state != nil
    lchomp_until!(is_not_space)
    state = send(state)
  end

  @options
end

Private Instance Methods

is_not_space() click to toggle source
# File lib/optparsegen/scopt.rb, line 20
def is_not_space
  /[^\s]/
end
is_space() click to toggle source
# File lib/optparsegen/scopt.rb, line 24
def is_space
  /\s/
end
lchomp_until!(matches) click to toggle source
# File lib/optparsegen/scopt.rb, line 28
def lchomp_until!(matches)
  p = @tape.index(matches)
  if p == nil
    @tape.slice!(-1)
  else
    @tape.slice!(0, p)
  end
end
parse_any() click to toggle source
# File lib/optparsegen/scopt.rb, line 37
def parse_any
  case
    when @tape.start_with?('-') then
      @tape.slice!(0, 1)
      :parse_opt
    when (p = @tape.index("\n")) != nil then
      @tape.slice!(0, p)
      :parse_any
    else
      nil
  end
end
parse_opt() click to toggle source
# File lib/optparsegen/scopt.rb, line 50
def parse_opt
  if @tape[0] == '-'
    @tape.slice!(0)
    :parse_opt_name
  else
    :parse_opt_short
  end
end
parse_opt_desc() click to toggle source
# File lib/optparsegen/scopt.rb, line 98
def parse_opt_desc
  desc = lchomp_until!("\n")
  if desc
    @current.description = desc
    @options.push(@current)
    @current = OptParseGen::Option.new
    :parse_any
  else
    raise 'expected description'
  end
end
parse_opt_name() click to toggle source
# File lib/optparsegen/scopt.rb, line 69
def parse_opt_name
  name = lchomp_until!(is_space)
  if name
    @current.name = name
    :parse_opt_value_or_desc
  else
    raise 'expected option name'
  end
end
parse_opt_short() click to toggle source
# File lib/optparsegen/scopt.rb, line 59
def parse_opt_short
  short = lchomp_until!(is_space).chop!
  if short
    @current.short = short
    :parse_any
  else
    raise 'expected short option name'
  end
end
parse_opt_value() click to toggle source
# File lib/optparsegen/scopt.rb, line 87
def parse_opt_value
  value = lchomp_until!(is_space)
  if value
    # TODO: Handle value examples.
    # @current.value = value
    :parse_opt_desc
  else
    raise 'expected value'
  end
end
parse_opt_value_or_desc() click to toggle source
# File lib/optparsegen/scopt.rb, line 79
def parse_opt_value_or_desc
  if @tape.start_with?('<')
    :parse_opt_value
  else
    :parse_opt_desc
  end
end