Как создать схему dhall с произвольным ключом, но с типизированными значениями? - PullRequest
3 голосов
/ 29 мая 2020

В dhall, как я могу создать схему для следующего yaml?

environment:
    local:
        path: "/path/to/env"
        envvars:
            - var1
            - var2
    stage:
        path: "/path/to/env"
        envvars:
            - var1
            - var2
    prod:
        path: "/path/to/env"
        envvars:
            - var1
            - var2

Как видите, он имеет произвольный ключ («local», «stage» и т. Д. c), но тот же тип для значений. Я считаю, что это довольно распространенный вариант использования, но я не видел, чтобы он обсуждался в учебнике.

1 Ответ

4 голосов
/ 29 мая 2020

Вы можете использовать Map, определенный в Prelude и обсужденный в Language Tour.

let Prelude = http://prelude.dhall-lang.org/v16.0.0/package.dhall

let Environment = { path : Text, envvars : List Text }

let EnvironmentSet = { environment : Prelude.Map.Type Text Environment }

in    { environment = toMap
          { local = { path = "/path/to/env", envvars = [ "var1", "var2" ] }
          , stage = { path = "/path/to/env", envvars = [ "var1", "var2" ] }
          , prod = { path = "/path/to/env", envvars = [ "var1", "var2" ] }
          }
      }
    : EnvironmentSet

dhall-to-yaml создает исходный YAML ( порядок клавиш по модулю):

% dhall-to-yaml < tmp.dhall
environment:
  local:
    envvars:
      - var1
      - var2
    path: /path/to/env
  prod:
    envvars:
      - var1
      - var2
    path: /path/to/env
  stage:
    envvars:
      - var1
      - var2
    path: /path/to/env

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

let Map = http://prelude.dhall-lang.org/v16.0.0/Map/package.dhall

let Environment = { path : Text, envvars : List Text }

let makeEnv =
        λ(name : Text)
      → λ(path : Text)
      → λ(vars : List Text)
      → Map.keyValue Environment name { path = path, envvars = vars }

let makeEnvironmentSet =
      λ(envs : List (Map.Entry Text Environment)) → { environment = envs }

in  makeEnvironmentSet
      [ makeEnv "local" "/path/to/local" [ "localvar1", "localvar2" ]
      , makeEnv "stage" "/path/to/stage" [ "stagevar1", "stagevar2" ]
      , makeEnv "prod" "/path/to/prod" [ "prodvar1", "prodvar2" ]
      ]

dhall-to-yaml преобразует запись типа {mapKey: k, mapValue: v} в объект YAML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...