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

sjsonnet.functions.FunctionBuilder.scala Maven / Gradle / Ivy

The newest version!
package sjsonnet.functions

import sjsonnet._

/**
 * Function building helpers for building functions of the Jsonnet language.
 */
trait FunctionBuilder {

  def builtin(obj: Val.Builtin): (String, Val.Builtin) = (obj.functionName, obj)

  def builtin[R: ReadWriter](name: String)(eval: (Position, EvalScope) => R): (String, Val.Func) = {
    (
      name,
      new Val.Builtin0(name) {
        def evalRhs(ev: EvalScope, outerPos: Position): Val = {
          // println("--- calling builtin: "+name)
          implicitly[ReadWriter[R]].write(outerPos, eval(outerPos, ev))
        }
      }
    )
  }

  def builtin[R: ReadWriter, T1: ReadWriter](name: String, p1: String)(
      eval: (Position, EvalScope, T1) => R): (String, Val.Func) = {
    (
      name,
      new Val.Builtin1(name, p1) {
        def evalRhs(arg1: Lazy, ev: EvalScope, outerPos: Position): Val = {
          // println("--- calling builtin: "+name)
          val v1: T1 = implicitly[ReadWriter[T1]].apply(arg1.force)
          implicitly[ReadWriter[R]].write(outerPos, eval(outerPos, ev, v1))
        }
      }
    )
  }

  def builtin[R: ReadWriter, T1: ReadWriter, T2: ReadWriter](name: String, p1: String, p2: String)(
      eval: (Position, EvalScope, T1, T2) => R): (String, Val.Func) = {
    (
      name,
      new Val.Builtin2(name, p1, p2) {
        def evalRhs(arg1: Lazy, arg2: Lazy, ev: EvalScope, outerPos: Position): Val = {
          // println("--- calling builtin: "+name)
          val v1: T1 = implicitly[ReadWriter[T1]].apply(arg1.force)
          val v2: T2 = implicitly[ReadWriter[T2]].apply(arg2.force)
          implicitly[ReadWriter[R]].write(outerPos, eval(outerPos, ev, v1, v2))
        }
      }
    )
  }

  def builtin[R: ReadWriter, T1: ReadWriter, T2: ReadWriter, T3: ReadWriter](
      name: String,
      p1: String,
      p2: String,
      p3: String)(eval: (Position, EvalScope, T1, T2, T3) => R): (String, Val.Func) = {
    (
      name,
      new Val.Builtin3(name, p1, p2, p3) {
        def evalRhs(arg1: Lazy, arg2: Lazy, arg3: Lazy, ev: EvalScope, outerPos: Position): Val = {
          // println("--- calling builtin: "+name)
          val v1: T1 = implicitly[ReadWriter[T1]].apply(arg1.force)
          val v2: T2 = implicitly[ReadWriter[T2]].apply(arg2.force)
          val v3: T3 = implicitly[ReadWriter[T3]].apply(arg3.force)
          implicitly[ReadWriter[R]].write(outerPos, eval(outerPos, ev, v1, v2, v3))
        }
      }
    )
  }

  def builtin[R: ReadWriter, T1: ReadWriter, T2: ReadWriter, T3: ReadWriter, T4: ReadWriter](
      name: String,
      p1: String,
      p2: String,
      p3: String,
      p4: String)(eval: (Position, EvalScope, T1, T2, T3, T4) => R): (String, Val.Func) = {
    (
      name,
      new Val.Builtin4(name, p1, p2, p3, p4) {
        def evalRhs(
            arg1: Lazy,
            arg2: Lazy,
            arg3: Lazy,
            arg4: Lazy,
            ev: EvalScope,
            outerPos: Position): Val = {
          // println("--- calling builtin: "+name)
          val v1: T1 = implicitly[ReadWriter[T1]].apply(arg1.force)
          val v2: T2 = implicitly[ReadWriter[T2]].apply(arg2.force)
          val v3: T3 = implicitly[ReadWriter[T3]].apply(arg3.force)
          val v4: T4 = implicitly[ReadWriter[T4]].apply(arg4.force)
          implicitly[ReadWriter[R]].write(outerPos, eval(outerPos, ev, v1, v2, v3, v4))
        }
      }
    )
  }

  /**
   * Helper function that can define a built-in function with default parameters
   *
   * Arguments of the eval function are (args, ev)
   */
  def builtinWithDefaults[R: ReadWriter](name: String, params: (String, Val.Literal)*)(
      eval: (Array[Val], Position, EvalScope) => R): (String, Val.Func) = {
    name -> new Val.Builtin(name, params.map(_._1).toArray, params.map(_._2).toArray) {
      def evalRhs(args: Array[? <: Lazy], ev: EvalScope, pos: Position): Val =
        implicitly[ReadWriter[R]].write(pos, eval(args.map(_.force), pos, ev))
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy