blob: 07d7e6267a8a39be5b41b4d38db7395bd50071ff (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
module Slop
# Cast the option argument to a String.
class StringOption < Option
def call(value)
value.to_s
end
end
# Cast the option argument to true or false.
# Override default_value to default to false instead of nil.
# This option type does not expect an argument. However, the API
# supports value being passed. This is to ensure it can capture
# an explicit false value
class BoolOption < Option
attr_accessor :explicit_value
def call(value)
self.explicit_value = value
!force_false?
end
def value
if force_false?
false
else
super
end
end
def force_false?
explicit_value == false
end
def default_value
config[:default] || false
end
def expects_argument?
false
end
end
BooleanOption = BoolOption
# Cast the option argument to an Integer.
class IntegerOption < Option
def call(value)
value =~ /\A[+-]?\d+\z/ && value.to_i
end
end
IntOption = IntegerOption
# Cast the option argument to a Float.
class FloatOption < Option
def call(value)
# TODO: scientific notation, etc.
value =~ /\A[+-]?\d*\.*\d+\z/ && value.to_f
end
end
# Collect multiple items into a single Array. Support
# arguments separated by commas or multiple occurences.
class ArrayOption < Option
def call(value)
@value ||= []
if delimiter
@value.concat value.split(delimiter, limit)
else
@value << value
end
end
def default_value
config[:default] || []
end
def delimiter
config.fetch(:delimiter, ",")
end
def limit
config[:limit] || 0
end
end
# Cast the option argument to a Regexp.
class RegexpOption < Option
def call(value)
Regexp.new(value)
end
end
# An option that discards the return value, inherits from Bool
# since it does not expect an argument.
class NullOption < BoolOption
def null?
true
end
end
end
|