Class: Consoler::Options

Inherits:
Object
  • Object
show all
Defined in:
lib/consoler/options.rb

Overview

List of options

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options_def) ⇒ Options

Create a list of option based on a string definition

Parameters:

  • options_def (String)

    A string definition of the desired options

Raises:

  • (RuntimeError)

    if you try to use a duplicate name



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/consoler/options.rb', line 16

def initialize(options_def)
  @options = []
  @description = nil

  return if options_def.nil?

  # strip the description
  if (match = /(^|\s+)-- (?<description>.*)$/.match(options_def))
    @description = match[:description]
    options_def = options_def[0...-match[0].size]
  end

  options = options_def.split ' '
  tracker = Consoler::OptionalsTracker.new

  option_names = []

  while (option_def = options.shift)
    Consoler::Option.create option_def, tracker do |option|
      raise "Duplicate option name: #{option.name}" if option_names.include? option.name

      option_names.push option.name

      option.aliases.each do |alias_|
        raise "Duplicate alias name: #{alias_.name}" if option_names.include? alias_.name

        option_names.push alias_.name
      end

      @options.push option
    end
  end
end

Instance Attribute Details

#descriptionString (readonly)

Description of the options

Returns:

  • (String)

    the current value of description



9
10
11
# File 'lib/consoler/options.rb', line 9

def description
  @description
end

Instance Method Details

#each {|Consoler::Option, Integer| ... } ⇒ Consoler::Options

Loop through all options

Yields:

Returns:



83
84
85
86
87
88
89
# File 'lib/consoler/options.rb', line 83

def each
  @options.each_with_index do |option, i|
    yield option, i
  end

  self
end

#get(name) ⇒ Consoler::Option?

Get a option by its name

May be matched by one of its aliases

Parameters:

  • name (String)

    Name of the option

Returns:



56
57
58
59
# File 'lib/consoler/options.rb', line 56

def get(name)
  option, = get_with_alias name
  option
end

#get_with_alias(name) ⇒ [(Consoler::Option, nil), (Consoler::Option, nil)]

Get a option by its name, with matched alias

Parameters:

  • name (String)

    Name of the option

Returns:



65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/consoler/options.rb', line 65

def get_with_alias(name)
  each do |option, _|
    if option.name == name
      return option, option
    end

    option.aliases.each do |alias_|
      return option, alias_ if alias_.name == name
    end
  end

  [nil, nil]
end

#sizeInteger

Get the number of options

Returns:

  • (Integer)


94
95
96
# File 'lib/consoler/options.rb', line 94

def size
  @options.size
end

#to_definitionString

Get the definition for these options

Returns:

  • (String)

    Options definition



101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/consoler/options.rb', line 101

def to_definition
  definition = ''
  optional = nil

  each do |option, i|
    definition += ' '

    if optional.nil? && option.is_optional
      definition += '['
      optional = option.is_optional
    end

    definition += option.to_definition

    # only close when the next option is not optional, or another optional group
    if option.is_optional && (@options[i + 1].nil? || optional != @options[i + 1].is_optional)
      definition += ']'
      optional = nil
    end
  end

  definition.strip
end