Можно ли иметь параметры макроаннотации (и как их получить)?

У меня есть некоторый источник данных, который требует операций переноса в транзакциях, которые имеют 2 возможных результата: успех и неудача. Этот подход вводит довольно много стандартного кода. То, что я хотел бы сделать, это что-то вроде этого (то же самое относится и к сбоям (что-то вроде @txFailure может быть)):

@txSuccess(dataSource)
def writeData(data: Data*) {
  dataSource.write(data)
}

куда @txSuccess это макрос аннотации, которая после обработки приведет к следующему:

def writeData(data: Data*) {
  val tx = dataSource.openTransaction()

  dataSource.write(data)

  tx.success()
  tx.close()
}

Как видите, этот подход может оказаться весьма полезным, так как в этом примере 75% кода может быть удалено из-за того, что он является образцом.

Это возможно? Если да, можете ли вы подтолкнуть меня в правильном направлении? Если нет, что вы можете порекомендовать, чтобы добиться чего-то подобного?

1 ответ

Это определенно возможно, но вам не обязательно нужны макросы для этой задачи.

Вот простое решение, которое не использует макросы

object DataOperation {
  def withTransation[T](dataSource: DataSource)(f: () => T): T = {
    val tx = dataSource.openTransation()
    f()
    tx.success()
    tx.close()
  }
}

И используйте это как

DataOperation.withTransation(dataSource) {
  dataSource.write(data)
}
Другие вопросы по тегам