All Downloads are FREE. Search and download functionalities are using the official Maven repository.

os.serial.internal.ToString.scala Maven / Gradle / Ivy

The newest version!
// Copyright 2013, 2014  Optersoft Inc. - www.optersoft.com

package os.serial

object ToString {

  def apply[S <: Serial](serial: S): String = new ToString(serial).run()

}

// http://es5.github.io/#x15.12.3
class ToString[S <: Serial](serial: S) {

  val sb = new StringBuilder
  var colon = false

  def run() = {
    //block(obj)
    sb.clear
    writeValue(serial)
    sb.toString
  }

  def writeValue(value: Any) {

    value match {
      case str: String =>
        sb += '"'
        encode(sb, str)
        sb += '"'
      case true => sb ++= "true"
      case int: Int => sb ++= int.toString
      case long: Long => sb ++= long.toString
      //case reflect: Reflect => block(reflect)
      case map: Map[_, _] => writeMap(map)
      case seq: Seq[_] =>
        var first = false
        sb += '['
        for (item <- seq) {
          if (first) sb += ','; first = true
          writeValue(item)
        }
        sb += ']'
      case () => sb ++= "null"
      case None => sb ++= "null"
      case Some(value) => writeValue(value)
      //case time: Time => writeValue(time.value)
      case _ => throw new SerialError("Not Serial: " + value)
    }
  }

  //  def block(obj: Reflect) {
  //
  //    val mirror = Reflect(obj)
  //
  //    colon = false
  //    sb += '{'
  //
  //    write("T", mirror.id)
  //    for (attribute <- mirror.attributes) {
  //      attribute.get(obj) match {
  //        case null =>
  //        case None =>
  //        //case s: Seq[_] if s.isEmpty =>
  //        case Some(value) => write(attribute, value)
  //        case value => write(attribute, value)
  //      }
  //    }
  //    sb += '}'
  //  }

  private[serial] def writeMap(map: Map[_, _]) {

    colon = false
    sb += '{'
    for ((key, value) <- map) {
      write(key.toString, value)
    }
    sb += '}'

  }

  //  private[serial] def write(attribute: Attribute, value: Any) {
  //
  //    value match {
  //      case 0 =>
  //      case false =>
  //      case _ => write(attribute.id, value)
  //    }
  //  }

  private[serial] def write(id: String, value: Any) {

    if (colon)
      sb += ','
    colon = true

    sb += '"'
    sb ++= id
    sb += '"'
    sb += ':'
    writeValue(value)
  }

  private[serial] def encode(sb: StringBuilder, string: String) {

    for (char <- string) {
      char match {
        case '"' => sb.append("\\\"")
        case '\\' => sb.append("\\\\")
        case '\b' => sb.append("\\b")
        case '\f' => sb.append("\\f")
        case '\n' => sb.append("\\n")
        case '\r' => sb.append("\\r")
        case '\t' => sb.append("\\t")
        case '/' => sb.append("\\/")
        case _ => //Reference: http://www.unicode.org/versions/Unicode5.1.0/
          if ((char >= '\u0000' && char <= '\u001F') ||
            (char >= '\u007F' && char <= '\u009F') ||
            (char >= '\u2000' && char <= '\u20FF')) {
            val ss = Integer.toHexString(char)
            sb.append("\\u")
            var k = 0; var to = 4 - ss.length()
            while (k < to) {
              sb.append('0')
              k += 1
            }
            sb.append(ss.toUpperCase());
          } else {
            sb.append(char);
          }
      }
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy