Я хотел бы обернуть все пользовательские функции в проекте scala, которые возвращают определенный тип T
, в функцию, которая принимает T
и имя функции в качестве параметров.
например.
учитывая, что эта функция находится в области видимости:
def withMetrics[T](functionName: String)(f: => Try[T]): Try[T] = {
f match {
case _: Success[T] => println(s"send metric: success for $functionName")
case _: Failure[T] => println(s"send metric: failure for $functionName")
}
f
}
пользователь может отправить метрики для своих функций, которые возвращают Try
, выполнив
def userDefinedFunction: Try[_] =
withMetrics("userDefinedFunction"){
somethingRisky: Try[_]
}
но я бы хотел, чтобы пользователь только определил
def userDefinedFunction: Try[_] =
somethingRisky: Try[_]
и его бизнес-логику, которая возвращает Try
, неявно завернутую в withMetrics
.
Обратите внимание, что пользователь не должен аннотировать код , так как это может привести к тому, что он забудет об этом.
Вместо этого все пользовательские функции, определенные в его проекте, должны автоматически включаться в withMetrics
.
Как мне добиться этого с помощью макросов Scala 2 или dotty?
Или это может быть достигнуто по-другому?