Можно ли загрузить конфигурацию приложения в макросе scala? - PullRequest
0 голосов
/ 16 марта 2020

Я пытаюсь написать макрос, который зависит от некоторой информации в конфигурации моего приложения Play. Я хотел бы использовать некоторую конфигурацию для генерации дерева в реализации макроса.

Когда я пытаюсь загрузить эту конфигурацию в макрос, я вижу ошибку, что параметр конфигурации не найден:

Error:(80, 16) exception during macro expansion: 
com.typesafe.config.ConfigException$Missing: No configuration setting found for key 'auth-service'
    at com.typesafe.config.impl.SimpleConfig.findKeyOrNull(SimpleConfig.java:156)
    at com.typesafe.config.impl.SimpleConfig.findOrNull(SimpleConfig.java:174)
    at com.typesafe.config.impl.SimpleConfig.find(SimpleConfig.java:188)
    at com.typesafe.config.impl.SimpleConfig.find(SimpleConfig.java:193)
    at com.typesafe.config.impl.SimpleConfig.getObject(SimpleConfig.java:268)
    at com.typesafe.config.impl.SimpleConfig.getObject(SimpleConfig.java:41)
    at mac.MyMacro$.mImpl(MyMacro.scala:16)
      MyMacro.m()

При использовании одного и того же кода загрузки конфигурации в тестовом примере все загружается нормально.

Мой макрос выглядит так:

object MyMacro {

  def m(): List[Int] = macro MyMacro.mImpl

  def mImpl(c: Context)() = {

    import c.universe._

    ConfigFactory.load().getObject("auth-service") // this fails

    q"""
         List(1, 2)
       """
  }
}

И тест, который пытается выполнить, выглядит следующим образом this:

    "test macro" in {
      ConfigFactory.load().getObject("auth-service") // this succeeds
      MyMacro.m()
    }

Не могли бы вы помочь мне понять, почему конфигурация приложения не загружается или недоступна в макросе? Если невозможно загрузить конфигурацию таким образом, каков общий способ решения такой проблемы, когда макрос зависит от объявленной конфигурации?

1 Ответ

1 голос
/ 16 марта 2020

Макросы должны быть определены в отдельном проекте; ConfigFactory.load() в этом проекте будет искать файлы конфигурации в пути к классам этого проекта, а не проекта, который использует макрос. Поэтому, если вы можете, часть конфигурации, используемая макросом, должна жить в этом проекте.

В качестве альтернативы вы можете использовать одну из ConfigFactory.parseFile() перегрузок для передачи указанного c файла, но тогда вашему макросу необходимо знать путь к приложению.

...