update NOTICE and LICENSE
[nit.git] / lib / opts.nit
index b9e5ceb..1d085b8 100644 (file)
 # You  are  allowed  to  redistribute it and sell it, alone or is a part of
 # another product.
 
+# Manage options on the command line
+module opts
+
 # Super class of all option's class
 class Option
        # Names for the option (including long and short ones)
-       readable attr _names: Array[String]
+       readable var _names: Array[String]
 
        # Type of the value of the option
-       type VALUE: Object
+       type VALUE: nullable Object
 
        # Human readable description of the option
-       readable attr _helptext: String 
+       readable var _helptext: String 
 
        # Is this option mandatory?
-       readable writable attr _mandatory: Bool 
+       readable writable var _mandatory: Bool 
 
-       # context where the option is located
-       readable writable attr _context: OptionContext 
+       # Current value of this option
+       writable var _value: nullable VALUE
 
        # Current value of this option
-       readable writable attr _value: VALUE 
+       fun value: VALUE do return _value.as(VALUE)
 
        # Default value of this option
-       readable writable attr _default_value: VALUE
+       readable writable var _default_value: nullable VALUE
 
        # Create a new option
-       init init_opt(help: String, default: VALUE, names: Array[String])
+       init init_opt(help: String, default: nullable VALUE, names: nullable Array[String])
        do
                if names == null then
                        _names = new Array[String]
@@ -49,62 +52,69 @@ class Option
        end
 
        # Add new aliases for this option
-       meth add_aliases(names: String...) do _names.add_all(names)
+       fun add_aliases(names: String...) do _names.add_all(names)
        
        # An help text for this option with default settings
-       redef meth to_s do return pretty(2)
+       redef fun to_s do return pretty(2)
        
        # A pretty print for this help
-       meth pretty(off: Int): String
+       fun pretty(off: Int): String
        do
-               var text = "  "
+               var text = new Buffer.from("  ")
                text.append(_names.join(", "))
                text.append("  ")
                var rest = off - text.length
                if rest > 0 then text.append(" " * rest)
                text.append(helptext)
                #text.append(pretty_default)
-               return text
+               return text.to_s
        end
 
-       meth pretty_default: String
+       fun pretty_default: String
        do
-               if default_value != null then
-                       return " ({default_value})"
-               end
+               var dv = default_value
+               if dv != null then return " ({dv})"
                return ""
        end
 
        # Consume parameters for this option
-       protected meth read_param(it: Iterator[String]) is abstract
+       protected fun read_param(it: Iterator[String]) is abstract
 end
 
 class OptionText
-special Option
+       super Option
        init(text: String) do init_opt(text, null, null)
 
-       redef meth pretty(off) do return to_s
+       redef fun pretty(off) do return to_s
 
-       redef meth to_s do return helptext
+       redef fun to_s do return helptext
 end
 
 class OptionBool
-special Option
+       super Option
        redef type VALUE: Bool
 
        init(help: String, names: String...) do init_opt(help, false, names)
 
-       redef meth read_param(it) do value = true
+       redef fun read_param(it) do value = true
+end
+
+class OptionCount
+       super Option
+       redef type VALUE: Int
+
+       init(help: String, names: String...) do init_opt(help, 0, names)
+
+       redef fun read_param(it) do value += 1
 end
 
 # Option with one mandatory parameter
 class OptionParameter
-special Option
-       protected meth convert(str: String): VALUE is abstract
+       super Option
+       protected fun convert(str: String): VALUE is abstract
 
-       redef meth read_param(it)
+       redef fun read_param(it)
        do
-               assert context != null
                if it.is_ok then
                        value = convert(it.item)
                        it.next
@@ -117,36 +127,38 @@ special Option
 end
 
 class OptionString
-special OptionParameter
-       redef type VALUE: String
+       super OptionParameter
+       redef type VALUE: nullable String
 
        init(help: String, names: String...) do init_opt(help, null, names)
 
-       redef meth convert(str) do return str
+       redef fun convert(str) do return str
 end
 
 class OptionEnum
-special OptionParameter
+       super OptionParameter
        redef type VALUE: Int
-       attr _enum: Array[String]
+       var _values: Array[String]
 
-       init(enum: Array[String], help: String, default: Int, names: String...)
+       init(values: Array[String], help: String, default: Int, names: String...)
        do
-               assert enum != null and enum.length > 0
-               _enum = enum.to_a
-               init_opt("{help} <{enum.join(", ")}>", default, names)
+               assert values.length > 0
+               _values = values.to_a
+               init_opt("{help} <{values.join(", ")}>", default, names)
        end
 
-       redef meth convert(str)
+       redef fun convert(str)
        do
-               var id = _enum.index_of(str)
+               var id = _values.index_of(str)
                return id
        end
 
-       redef meth pretty_default
+       fun value_name: String = _values[value]
+
+       redef fun pretty_default
        do
                if default_value != null then
-                       return " ({_enum[default_value]})"
+                       return " ({_values[default_value.as(not null)]})"
                else
                        return ""
                end
@@ -154,16 +166,16 @@ special OptionParameter
 end
 
 class OptionInt
-special OptionParameter
+       super OptionParameter
        redef type VALUE: Int
 
        init(help: String, default: Int, names: String...) do init_opt(help, default, names)
        
-       redef meth convert(str) do return str.to_i
+       redef fun convert(str) do return str.to_i
 end
 
 class OptionArray
-special OptionParameter
+       super OptionParameter
        redef type VALUE: Array[String]
 
        init(help: String, names: String...)
@@ -172,8 +184,8 @@ special OptionParameter
                init_opt(help, _values, names)
        end
 
-       attr _values: Array[String]     
-       redef meth convert(str)
+       var _values: Array[String]      
+       redef fun convert(str)
        do
                _values.add(str)
                return _values
@@ -181,12 +193,12 @@ special OptionParameter
 end
 
 class OptionContext
-       readable attr _options: Array[Option] 
-       readable attr _rest: Array[String] 
+       readable var _options: Array[Option] 
+       readable var _rest: Array[String] 
 
-       attr _optmap: Map[String, Option]
+       var _optmap: Map[String, Option]
        
-       meth usage
+       fun usage
        do
                var lmax = 1
                for i in _options do
@@ -203,13 +215,13 @@ class OptionContext
        end
 
        # Parse ans assign options everywhere is the argument list
-       meth parse(argv: Collection[String])
+       fun parse(argv: Collection[String])
        do
                var it = argv.iterator
                parse_intern(it)
        end
 
-       protected meth parse_intern(it: Iterator[String])
+       protected fun parse_intern(it: Iterator[String])
        do
                var parseargs = true
                build
@@ -234,10 +246,9 @@ class OptionContext
                end
        end
 
-       meth add_option(opts: Option...)
+       fun add_option(opts: Option...)
        do
                for opt in opts do
-                       opt.context = self
                        _options.add(opt)
                end
        end
@@ -249,7 +260,7 @@ class OptionContext
                _rest = new Array[String]
        end
 
-       private meth build
+       private fun build
        do
                for o in _options do
                        for n in o.names do