stream: Optimize `StringIStream.read_all`
[nit.git] / lib / opts.nit
index d6efd3e..8c8f9ea 100644 (file)
@@ -29,19 +29,19 @@ abstract class Option
        var errors: Array[String] = new Array[String]
 
        # Is this option mandatory?
-       var mandatory: Bool writable = false
+       var mandatory: Bool = false is writable
 
        # Is this option hidden from `usage`?
-       var hidden: Bool writable = false
+       var hidden: Bool = false is writable
 
        # Has this option been read?
-       var read: Bool writable = false
+       var read: Bool = false is writable
 
        # Current value of this option
-       var value: VALUE writable
+       var value: VALUE is writable
 
        # Default value of this option
-       var default_value: VALUE writable
+       var default_value: VALUE is writable
 
        # Create a new option
        init(help: String, default: VALUE, names: nullable Array[String])
@@ -138,12 +138,12 @@ abstract class OptionParameter
        protected fun convert(str: String): VALUE is abstract
 
        # Is the parameter mandatory?
-       var parameter_mandatory: Bool writable = true
+       var parameter_mandatory: Bool = true is writable
 
        redef fun read_param(it)
        do
                super
-               if it.is_ok and it.item.chars.first != '-' then
+               if it.is_ok and (it.item.is_empty or it.item.chars.first != '-') then
                        value = convert(it.item)
                        it.next
                else
@@ -194,11 +194,7 @@ class OptionEnum
 
        redef fun pretty_default
        do
-               if default_value != null then
-                       return " ({values[default_value]})"
-               else
-                       return ""
-               end
+               return " ({values[default_value]})"
        end
 end
 
@@ -245,23 +241,15 @@ end
 # Context where the options process
 class OptionContext
        # Options present in the context
-       var options: Array[Option]
+       var options = new Array[Option]
 
        # Rest of the options after `parse` is called
-       var rest: Array[String]
+       var rest = new Array[String]
 
        # Errors found in the context after parsing
-       var errors: Array[String]
+       var errors = new Array[String]
 
-       private var optmap: Map[String, Option]
-
-       init
-       do
-               options = new Array[Option]
-               optmap = new HashMap[String, Option]
-               rest = new Array[String]
-               errors = new Array[String]
-       end
+       private var optmap = new HashMap[String, Option]
 
        # Add one or more options to the context
        fun add_option(opts: Option...) do
@@ -294,6 +282,14 @@ class OptionContext
                parse_intern(it)
        end
 
+       # Must all option be given before the first argument?
+       #
+       # When set to `false` (the default), options of the command line are
+       # all parsed until the end of the list of arguments or until "--" is met (in this case "--" is discarded).
+       #
+       # When set to `true` options are parsed until the first non-option is met.
+       var options_before_rest = false is writable
+
        # Parse the command line
        protected fun parse_intern(it: Iterator[String])
        do
@@ -331,6 +327,10 @@ class OptionContext
                                        else
                                                rest.add(it.item)
                                                it.next
+                                               if options_before_rest then
+                                                       rest.add_all(it.to_a)
+                                                       parseargs = false
+                                               end
                                        end
                                end
                        end
@@ -354,7 +354,7 @@ class OptionContext
 
        fun get_errors: Array[String]
        do
-               var errors: Array[String] = new Array[String]
+               var errors = new Array[String]
                errors.add_all(errors)
                for o in options do
                        for e in o.errors do