src/Pure/General/json.scala
changeset 67843 ff561f6e0a8e
parent 67842 ff87225e7e8e
child 67850 3e9fe7a84b5d
equal deleted inserted replaced
67842:ff87225e7e8e 67843:ff561f6e0a8e
   230       result.toString
   230       result.toString
   231     }
   231     }
   232   }
   232   }
   233 
   233 
   234 
   234 
   235   /* values */
   235   /* typed values */
   236 
   236 
   237   object Value
   237   object Value
   238   {
   238   {
   239     object String {
   239     object String {
   240       def unapply(json: T): Option[java.lang.String] =
   240       def unapply(json: T): Option[java.lang.String] =
   276 
   276 
   277     object Boolean {
   277     object Boolean {
   278       def unapply(json: T): Option[scala.Boolean] =
   278       def unapply(json: T): Option[scala.Boolean] =
   279         json match {
   279         json match {
   280           case x: scala.Boolean => Some(x)
   280           case x: scala.Boolean => Some(x)
       
   281           case _ => None
       
   282         }
       
   283     }
       
   284 
       
   285     object List
       
   286     {
       
   287       def unapply[A](json: T, unapply: T => Option[A]): Option[List[A]] =
       
   288         json match {
       
   289           case xs: List[T] =>
       
   290             val ys = xs.map(unapply)
       
   291             if (ys.forall(_.isDefined)) Some(ys.map(_.get)) else None
   281           case _ => None
   292           case _ => None
   282         }
   293         }
   283     }
   294     }
   284   }
   295   }
   285 
   296 
   308     value(obj, name) match {
   319     value(obj, name) match {
   309       case Some(a: List[T]) => Some(a)
   320       case Some(a: List[T]) => Some(a)
   310       case _ => None
   321       case _ => None
   311     }
   322     }
   312 
   323 
   313   def array[A](obj: T, name: String, unapply: T => Option[A]): Option[List[A]] =
   324   def value_default[A](obj: T, name: String, unapply: T => Option[A], default: A): Option[A] =
   314     for {
   325     value(obj, name) match {
   315       a0 <- array(obj, name)
   326       case None => Some(default)
   316       a = a0.map(unapply(_))
   327       case Some(json) => unapply(json)
   317       if a.forall(_.isDefined)
   328     }
   318     } yield a.map(_.get)
       
   319 
   329 
   320   def string(obj: T, name: String): Option[String] =
   330   def string(obj: T, name: String): Option[String] =
   321     value(obj, name, Value.String.unapply)
   331     value(obj, name, Value.String.unapply)
       
   332   def string_default(obj: T, name: String, default: String = ""): Option[String] =
       
   333     value_default(obj, name, Value.String.unapply, default)
   322 
   334 
   323   def double(obj: T, name: String): Option[Double] =
   335   def double(obj: T, name: String): Option[Double] =
   324     value(obj, name, Value.Double.unapply)
   336     value(obj, name, Value.Double.unapply)
       
   337   def double_default(obj: T, name: String, default: Double = 0.0): Option[Double] =
       
   338     value_default(obj, name, Value.Double.unapply, default)
   325 
   339 
   326   def long(obj: T, name: String): Option[Long] =
   340   def long(obj: T, name: String): Option[Long] =
   327     value(obj, name, Value.Long.unapply)
   341     value(obj, name, Value.Long.unapply)
       
   342   def long_default(obj: T, name: String, default: Long = 0): Option[Long] =
       
   343     value_default(obj, name, Value.Long.unapply, default)
   328 
   344 
   329   def int(obj: T, name: String): Option[Int] =
   345   def int(obj: T, name: String): Option[Int] =
   330     value(obj, name, Value.Int.unapply)
   346     value(obj, name, Value.Int.unapply)
       
   347   def int_default(obj: T, name: String, default: Int = 0): Option[Int] =
       
   348     value_default(obj, name, Value.Int.unapply, default)
   331 
   349 
   332   def bool(obj: T, name: String): Option[Boolean] =
   350   def bool(obj: T, name: String): Option[Boolean] =
   333     value(obj, name, Value.Boolean.unapply)
   351     value(obj, name, Value.Boolean.unapply)
       
   352   def bool_default(obj: T, name: String, default: Boolean = false): Option[Boolean] =
       
   353     value_default(obj, name, Value.Boolean.unapply, default)
       
   354 
       
   355   def list[A](obj: T, name: String, unapply: T => Option[A]): Option[List[A]] =
       
   356     value(obj, name, Value.List.unapply(_, unapply))
       
   357   def list_default[A](obj: T, name: String, unapply: T => Option[A], default: List[A] = Nil)
       
   358     : Option[List[A]] = value_default(obj, name, Value.List.unapply(_, unapply), default)
   334 }
   359 }