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

eu.inn.binders.json.internal.JsonMacroImpl.scala Maven / Gradle / Ivy

package eu.inn.binders.json.internal

import java.io.OutputStream

import scala.language.experimental.macros
import scala.language.reflectiveCalls
import scala.reflect.macros.Context

private [json] trait JsonMacroImpl {
  val c: Context
  import c.universe._

  def parseJson[O: c.WeakTypeTag]: c.Tree = {
    val t = fresh("t")
    val d = fresh("d")
    val block = q"""{
      val $t = ${c.prefix.tree}
      SerializerFactory.findFactory().withStringParser[${weakTypeOf[O]}]($t.jsonString) { case ($d) =>
        $d.unbind[${weakTypeOf[O]}]
      }
    }"""
    //println(block)
    block
  }

  def toJson[O: c.WeakTypeTag]: c.Tree = {
    val t = fresh("t")
    val s = fresh("s")
    val block = q"""{
      val $t = ${c.prefix.tree}
      SerializerFactory.findFactory().withStringGenerator { case ($s) =>
        $s.bind[${weakTypeOf[O]}]($t.obj)
      }
    }"""
    //println(block)
    block
  }

  def readJson[O: c.WeakTypeTag]: c.Tree = {
    val t = fresh("t")
    val d = fresh("d")
    val block = q"""{
      val $t = ${c.prefix.tree}
      SerializerFactory.findFactory().withStreamParser[${weakTypeOf[O]}]($t.inputStream) { case ($d) =>
        $d.unbind[${weakTypeOf[O]}]
      }
    }"""
    //println(block)
    block
  }

  def writeJson[O: c.WeakTypeTag](outputStream: c.Expr[OutputStream]): c.Tree = {
    val t = fresh("t")
    val s = fresh("s")
    val block = q"""{
      val $t = ${c.prefix.tree}
      SerializerFactory.findFactory().withStreamGenerator($outputStream) { case ($s) =>
        $s.bind[${weakTypeOf[O]}]($t.obj)
      }
    }"""
    //println(block)
    block
  }

  def fresh(prefix: String): TermName = newTermName(c.fresh(prefix))
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy