1 # This file is part of NIT ( http://www.nitlanguage.org ).
3 # Copyright 2008 Floréal Morandat <morandat@lirmm.fr>
4 # Copyright 2008 Jean Privat <jean@pryen.org>
6 # This file is free software, which comes along with NIT. This software is
7 # distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
8 # without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
9 # PARTICULAR PURPOSE. You can modify it is you want, provided this header
10 # is kept unaltered, and a notification of the changes is added.
11 # You are allowed to redistribute it and sell it, alone or is a part of
14 # Super class of all option's class
16 # Names for the option (including long and short ones)
17 readable attr _names
: Array[String]
19 # Type of the value of the option
22 # Human readable description of the option
23 readable attr _helptext
: String
25 # Is this option mandatory?
26 readable writable attr _mandatory
: Bool
28 # context where the option is located
29 readable writable attr _context
: OptionContext
31 # Current value of this option
32 readable writable attr _value
: VALUE
34 # Default value of this option
35 readable writable attr _default_value
: VALUE
38 init init_opt
(help
: String, default
: VALUE, names
: Array[String])
41 _names
= new Array[String]
47 _default_value
= default
51 # Add new aliases for this option
52 meth add_aliases
(names
: String...) do _names
.add_all
(names
)
54 # An help text for this option with default settings
55 redef meth to_s
do return pretty
(2)
57 # A pretty print for this help
58 meth pretty
(off
: Int): String
60 var text
= new Buffer.from
(" ")
61 text
.append
(_names
.join
(", "))
63 var rest
= off
- text
.length
64 if rest
> 0 then text
.append
(" " * rest
)
66 #text.append(pretty_default)
70 meth pretty_default
: String
72 if default_value
!= null then
73 return " ({default_value})"
78 # Consume parameters for this option
79 protected meth read_param
(it
: Iterator[String]) is abstract
84 init(text
: String) do init_opt
(text
, null, null)
86 redef meth pretty
(off
) do return to_s
88 redef meth to_s
do return helptext
93 redef type VALUE: Bool
95 init(help
: String, names
: String...) do init_opt
(help
, false, names
)
97 redef meth read_param
(it
) do value
= true
102 redef type VALUE: Int
104 init(help
: String, names
: String...) do init_opt
(help
, 0, names
)
106 redef meth read_param
(it
) do value
+= 1
109 # Option with one mandatory parameter
110 class OptionParameter
112 protected meth convert
(str
: String): VALUE is abstract
114 redef meth read_param
(it
)
116 assert context
!= null
118 value
= convert
(it
.item
)
125 init init_opt
(h
, d
, n
) do super
129 special OptionParameter
130 redef type VALUE: String
132 init(help
: String, names
: String...) do init_opt
(help
, null, names
)
134 redef meth convert
(str
) do return str
138 special OptionParameter
139 redef type VALUE: Int
140 attr _enum
: Array[String]
142 init(enum: Array[String], help
: String, default
: Int, names
: String...)
144 assert enum != null and enum.length
> 0
146 init_opt
("{help} <{enum.join(", ")}>", default
, names
)
149 redef meth convert
(str
)
151 var id
= _enum
.index_of
(str
)
155 redef meth pretty_default
157 if default_value
!= null then
158 return " ({_enum[default_value]})"
166 special OptionParameter
167 redef type VALUE: Int
169 init(help
: String, default
: Int, names
: String...) do init_opt
(help
, default
, names
)
171 redef meth convert
(str
) do return str
.to_i
175 special OptionParameter
176 redef type VALUE: Array[String]
178 init(help
: String, names
: String...)
180 _values
= new Array[String]
181 init_opt
(help
, _values
, names
)
184 attr _values
: Array[String]
185 redef meth convert
(str
)
193 readable attr _options
: Array[Option]
194 readable attr _rest
: Array[String]
196 attr _optmap
: Map[String, Option]
206 if lmax
< l
then lmax
= l
210 print
(i
.pretty
(lmax
))
214 # Parse ans assign options everywhere is the argument list
215 meth parse
(argv
: Collection[String])
217 var it
= argv
.iterator
221 protected meth parse_intern
(it
: Iterator[String])
227 while parseargs
and it
.is_ok
do
231 rest
.add_all
(it
.to_a
)
234 if _optmap
.has_key
(str
) then
235 var opt
= _optmap
[str
]
246 meth add_option
(opts
: Option...)
256 _options
= new Array[Option]
257 _optmap
= new HashMap[String, Option]
258 _rest
= new Array[String]