Как обрабатывать перечисления в dhall? - PullRequest
1 голос
/ 23 марта 2019

Мне нужно набрать и сгенерировать конфигурацию, которая содержит строковые значения перечисления.Мне удалось определить следующие строки.В конце мне нужно преобразовать объединение в строковое значение.

let ParameterLocation = < Query : {}
                        | Header : {}
                        | Path : {}
                        | Cookie : {}
                        >
let ParameterObject = {
                          name : Text,
                          `in` : ParameterLocation,
                          required : Bool
                      }
let locationToText = \(loc : ParameterLocation) -> merge {
       Query = \(_ : {}) -> "query",
       Header = \(_ : {}) -> "header",
       Path = \(_ : {}) -> "path",
       Cookie = \(_ : {}) -> "cookie"
    } loc
let t : ParameterObject = {
    name = "organisation_id",
    `in` = ParameterLocation.Query {=},
    required = False
 }
in t // { `in` = locationToText t.`in` }

Здесь запись, содержащая объединение / перечисление, находится сверху, поэтому я могу довольно легко получить к ней доступ, но в окончательной конфигурации ParameterObjectСи довольно глубоко вложенный.

Есть ли способ

  • "пересечь" произвольную структуру записи и применить locationToText везде, где это применимо?
  • или скормить dhall-json / dhall-yaml принтером для такого значения?
  • или лучший способ определить мое перечисление для более легкого достижения моей цели?

1 Ответ

1 голос
/ 24 марта 2019

Существует предложение добавить поддержку типов объединений с пустыми альтернативами (например, перечисления) к языку, который будет объединен через пару дней:

https://github.com/dhall-lang/dhall-lang/pull/438

После объединения язык будет поддерживать более естественные перечисления, например:

let ParameterLocation = < Query
                        | Header
                        | Path
                        | Cookie
                        >

let locationToText = \(loc : ParameterLocation) -> merge {
       Query = "query",
       Header = "header",
       Path = "path",
       Cookie = "cookie"
    } loc

...

Кроме того, dhall-to-json и dhall-to-yaml смогут использовать новую встроенную поддержку пустых альтернатив для отображения альтернативного имени в виде строки вместо удаления тега. Это должно быть доступно в следующем выпуске стандарта (версия 7.0.0) и следующей версии dhall-to-json / dhall-to-yaml (1.2.8).

...