Merge: Opts: small improvement
authorJean Privat <jean@pryen.org>
Wed, 23 Jul 2014 18:22:54 +0000 (14:22 -0400)
committerJean Privat <jean@pryen.org>
Wed, 23 Jul 2014 18:22:54 +0000 (14:22 -0400)
- syntax & comment
- hide an option
- fix an old bug

This rewrites and closes #531

Pull-Request: #612
Reviewed-by: Frédéric Vachon <fredvac@gmail.com>
Reviewed-by: Alexandre Terrasa <alexandre@moz-code.org>

1  2 
lib/opts.nit

diff --combined lib/opts.nit
@@@ -31,6 -31,9 +31,9 @@@ abstract class Optio
        # Is this option mandatory?
        var mandatory: Bool writable = false
  
+       # Is this option hidden from `usage`?
+       var hidden: Bool writable = false
        # Has this option been read?
        var read: Bool writable = false
  
  
        # Add new aliases for this option
        fun add_aliases(names: String...) do names.add_all(names)
-       
        # An help text for this option with default settings
        redef fun to_s do return pretty(2)
-       
        # A pretty print for this help
        fun pretty(off: Int): String
        do
@@@ -80,7 -83,7 +83,7 @@@
        fun pretty_default: String
        do
                var dv = default_value
 -              if dv != null then return " ({dv})"
 +              if dv != null then return " ({dv.to_s})"
                return ""
        end
  
@@@ -91,6 -94,7 +94,7 @@@
        end
  end
  
+ # Not really an option. Just add a line of text when displaying the usage
  class OptionText
        super Option
        init(text: String) do super(text, null, null)
        redef fun to_s do return helptext
  end
  
+ # A boolean option, `true` when present, `false` if not
  class OptionBool
        super Option
        redef type VALUE: Bool
        end
  end
  
+ # A count option. Count the number of time this option is present
  class OptionCount
        super Option
        redef type VALUE: Int
@@@ -148,6 -154,7 +154,7 @@@ abstract class OptionParamete
        end
  end
  
+ # An option with a String as parameter
  class OptionString
        super OptionParameter
        redef type VALUE: nullable String
        redef fun convert(str) do return str
  end
  
+ # An option with an enum as parameter
+ # In the code, declaring an option enum (-e) with an enum like `["zero", "one", "two"]
+ # In the command line, typing `myprog -e one` is giving 1 as value
  class OptionEnum
        super OptionParameter
        redef type VALUE: Int
        redef fun pretty_default
        do
                if default_value != null then
 -                      return " ({values[default_value.as(not null)]})"
 +                      return " ({values[default_value]})"
                else
                        return ""
                end
-       end     
+       end
  end
  
+ # An option with an Int as parameter
  class OptionInt
        super OptionParameter
        redef type VALUE: Int
  
        init(help: String, default: Int, names: String...) do super(help, default, names)
-       
        redef fun convert(str) do return str.to_i
  end
  
+ # An option with a Float as parameter
  class OptionFloat
        super OptionParameter
        redef type VALUE: Float
  
        init(help: String, default: Float, names: String...) do super(help, default, names)
-       
        redef fun convert(str) do return str.to_f
  end
  
+ # An option with an array as parameter
+ # `myprog -optA arg1 -optA arg2` is giving an Array `["arg1", "arg2"]`
  class OptionArray
        super OptionParameter
        redef type VALUE: Array[String]
        end
  end
  
+ # Context where the options process
  class OptionContext
+       # Options present in the context
        var options: Array[Option]
+       # Rest of the options after `parse` is called
        var rest: Array[String]
+       # Errors found in the context after parsing
        var errors: 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
+       # Add one or more options to the context
+       fun add_option(opts: Option...) do
+                       options.add_all(opts)
+       end
+       # Display all the options available
        fun usage
        do
                var lmax = 1
                        end
                        if lmax < l then lmax = l
                end
-               
                for i in options do
-                       print(i.pretty(lmax))
+                       if not i.hidden then
+                               print(i.pretty(lmax))
+                       end
                end
        end
  
-       # Parse ans assign options everywhere is the argument list
+       # Parse and assign options everywhere in the argument list
        fun parse(argv: Collection[String])
        do
                var it = argv.iterator
                parse_intern(it)
        end
  
+       # Parse the command line
        protected fun parse_intern(it: Iterator[String])
        do
                var parseargs = true
                                # We're looking for packed short options
                                if str.chars.last_index_of('-') == 0 and str.length > 2 then
                                        var next_called = false
-                                       for i in [1..str.length] do
+                                       for i in [1..str.length[ do
                                                var short_opt = "-" + str.chars[i].to_s
                                                if optmap.has_key(short_opt) then
                                                        var option = optmap[short_opt]
                end
        end
  
-       fun add_option(opts: Option...)
-       do
-               for opt in opts do
-                       options.add(opt)
-               end
-       end
-       init
-       do
-               options = new Array[Option]
-               optmap = new HashMap[String, Option]
-               rest = new Array[String]
-               errors = new Array[String]
-       end
        private fun build
        do
                for o in options do
        fun get_errors: Array[String]
        do
                var errors: Array[String] = new Array[String]
                errors.add_all(errors)
                for o in options do
                        for e in o.errors do
                                errors.add(e)
                        end
                end
                return errors
        end
  end