src/Pure/System/options.scala
changeset 49247 ffd9ad9dc35b
parent 49246 248e66e8321f
child 49270 e5d162d15867
equal deleted inserted replaced
49246:248e66e8321f 49247:ffd9ad9dc35b
    28   case object Int extends Type
    28   case object Int extends Type
    29   case object Real extends Type
    29   case object Real extends Type
    30   case object String extends Type
    30   case object String extends Type
    31   case object Unknown extends Type
    31   case object Unknown extends Type
    32 
    32 
    33   case class Opt(typ: Type, value: String, description: String)
    33   case class Opt(name: String, typ: Type, value: String, description: String)
    34   {
    34   {
       
    35     def print: String =
       
    36       "option " + name + " : " + typ.print + " = " +
       
    37         (if (typ == Options.String) quote(value) else value) +
       
    38       (if (description == "") "" else "\n  -- " + quote(description))
       
    39 
    35     def unknown: Boolean = typ == Unknown
    40     def unknown: Boolean = typ == Unknown
    36   }
    41   }
    37 
    42 
    38 
    43 
    39   /* parsing */
    44   /* parsing */
   122 
   127 
   123 final class Options private(protected val options: Map[String, Options.Opt] = Map.empty)
   128 final class Options private(protected val options: Map[String, Options.Opt] = Map.empty)
   124 {
   129 {
   125   override def toString: String = options.iterator.mkString("Options (", ",", ")")
   130   override def toString: String = options.iterator.mkString("Options (", ",", ")")
   126 
   131 
   127   def print: String =
   132   def print: String = cat_lines(options.toList.sortBy(_._1).map(p => p._2.print))
   128     cat_lines(options.toList.sortBy(_._1).map({ case (name, opt) =>
       
   129       "option " + name + " : " + opt.typ.print + " = " +
       
   130         (if (opt.typ == Options.String) quote(opt.value) else opt.value) +
       
   131       (if (opt.description == "") "" else "\n  -- " + quote(opt.description)) }))
       
   132 
   133 
   133   def title(strip: String, name: String): String =
   134   def title(strip: String, name: String): String =
   134   {
   135   {
   135     check_name(name)
   136     check_name(name)
   136     val words = space_explode('_', name)
   137     val words = space_explode('_', name)
   236             case "int" => Options.Int
   237             case "int" => Options.Int
   237             case "real" => Options.Real
   238             case "real" => Options.Real
   238             case "string" => Options.String
   239             case "string" => Options.String
   239             case _ => error("Unknown type for option " + quote(name) + " : " + quote(typ_name))
   240             case _ => error("Unknown type for option " + quote(name) + " : " + quote(typ_name))
   240           }
   241           }
   241         val opt = Options.Opt(typ, value, description)
   242         val opt = Options.Opt(name, typ, value, description)
   242         (new Options(options + (name -> opt))).check_value(name)
   243         (new Options(options + (name -> opt))).check_value(name)
   243     }
   244     }
   244   }
   245   }
   245 
   246 
   246   def add_permissive(name: String, value: String): Options =
   247   def add_permissive(name: String, value: String): Options =
   247   {
   248   {
   248     if (options.isDefinedAt(name)) this + (name, value)
   249     if (options.isDefinedAt(name)) this + (name, value)
   249     else new Options(options + (name -> Options.Opt(Options.Unknown, value, "")))
   250     else new Options(options + (name -> Options.Opt(name, Options.Unknown, value, "")))
   250   }
   251   }
   251 
   252 
   252   def + (name: String, value: String): Options =
   253   def + (name: String, value: String): Options =
   253   {
   254   {
   254     val opt = check_name(name)
   255     val opt = check_name(name)