Интерполяция переменных среды YAML в SnakeYAML scala

Используя лучшее из SnakeYAML и Jackson в scala, я использую следующий метод для анализа файлов YAML. Этот метод поддерживает использование якорей в YAML.

import com.fasterxml.jackson.databind.{JsonNode, ObjectMapper}
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import java.io.{File, FileInputStream}
import org.yaml.snakeyaml.{DumperOptions, LoaderOptions, Yaml}
/**
 * YAML Parser using SnakeYAML & Jackson Implementation
 *
 * @param yamlFilePath : Path to the YAML file that has to be parsed
 * @return: JsonNode of YAML file
 */
def parseYaml(yamlFilePath: String): JsonNode = {
  // Parsing the YAML file with SnakeYAML - since Jackson Parser does not have Anchors and reference support
  val ios = new FileInputStream(new File(yamlFilePath))
  val loaderOptions = new LoaderOptions
  loaderOptions.setAllowDuplicateKeys(false)
  val yaml = new Yaml(
    loaderOptions
  )

  val mapper = new ObjectMapper().registerModules(DefaultScalaModule)
  val yamlObj = yaml.loadAs(ios, classOf[Any])

  // Converting the YAML to Jackson YAML - since it has more flexibility for traversing through nodes
  val jsonString = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(yamlObj)
  val jsonObj = mapper.readTree(jsonString)
  println(jsonString)
  jsonObj
}

Однако в настоящее время это не поддерживает интерполяцию переменных среды в файле YAML. Например: если мы получим следующие переменные среды, когда мы делаем

>>> println(System.getenv())
{PATH=/usr/bin:/bin:/usr/sbin:/sbin, XPC_FLAGS=0x0, SHELL=/bin/bash}

Вопрос в том, как добиться интерполяции переменных среды в файле yaml, скажем, у нас есть следующий файл YAML:

path_value: ${PATH}
xpc: ${XPC_FLAGS}
shell_path: ${SHELL}

Затем после разбора YAML должно быть:

{
   "path_value": "/usr/bin:/bin:/usr/sbin:/sbin",
   "xpc": "0x0",
   "shell_path": "/bin/bash"
}

Спасибо за ваше время и усилия, чтобы ответить заранее!


person Abhishek Kanaparthi    schedule 06.04.2021    source источник
comment
поскольку это разрешение env не является частью ни YAML, ни Json, вам придется реализовать его самостоятельно. Вы можете пройтись по дереву Json и всякий раз, когда вы видите String в форме ${...}, замените его разрешением env.   -  person sarveshseri    schedule 06.04.2021
comment
С помощью SnakeYAML вы можете получить Constructor и зарегистрировать пользовательскую реализацию Construct для Tag.STR, чтобы она использовалась для всех узлов, которые будут созданы в String. Этот ответ показывает код Java; Я недостаточно знаю Scala, чтобы перевести его для вашего варианта использования.   -  person flyx    schedule 07.04.2021