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

io.fmq.address.LiteralSyntaxMacros.scala Maven / Gradle / Ivy

The newest version!
package io.fmq.address

import scala.reflect.macros.blackbox

/**
  * Taken from https://github.com/Comcast/ip4s/blob/b4f01a4637f2766a8e12668492a3814c478c6a03/shared/src/main/scala/com/comcast/ip4s/LiteralSyntaxMacros.scala
  */
@SuppressWarnings(Array("org.wartremover.warts.StringPlusAny"))
object LiteralSyntaxMacros {

  def tcpIncomplete(c: blackbox.Context)(args: c.Expr[Any]*): c.Expr[Uri.Incomplete.TCP] =
    singlePartInterpolator(c)(
      args,
      "Uri.Incomplete.TCP",
      s => Uri.Incomplete.tcpFromString("tcp" + s),
      s => c.universe.reify(Uri.Incomplete.tcpFromStringUnsafe("tcp" + s.splice))
    )

  def tcpComplete(c: blackbox.Context)(args: c.Expr[Any]*): c.Expr[Uri.Complete.TCP] =
    singlePartInterpolator(c)(
      args,
      "Uri.Complete.TCP",
      s => Uri.Complete.tcpFromString("tcp" + s),
      s => c.universe.reify(Uri.Complete.tcpFromStringUnsafe("tcp" + s.splice))
    )

  def inprocComplete(c: blackbox.Context)(args: c.Expr[Any]*): c.Expr[Uri.Complete.InProc] =
    singlePartInterpolator(c)(
      args,
      "Uri.Complete.InProc",
      s => Uri.Complete.inProcFromString("inproc" + s),
      s => c.universe.reify(Uri.Complete.inProcFromStringUnsafe("inproc" + s.splice))
    )

  private def singlePartInterpolator[A](c: blackbox.Context)(
      args: Seq[c.Expr[Any]],
      typeName: String,
      validate: String => Either[Throwable, A],
      construct: c.Expr[String] => c.Expr[A]
  ): c.Expr[A] = {
    import c.universe._
    val _ = args
    c.prefix.tree match {
      case Apply(_, List(Apply(_, (lcp @ Literal(Constant(p: String))) :: Nil))) =>
        validate(p).fold(
          e => c.abort(c.enclosingPosition, s"invalid $typeName: ${e.getMessage}"),
          _ => construct(c.Expr(lcp))
        )

      case _ =>
        c.abort(c.enclosingPosition, s"$typeName does not support interpolated string with arguments")
    }
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy