dhall-to-yaml: представление неструктурированных блоков, вложенных в структурированный yaml - PullRequest
1 голос
/ 12 мая 2019

Я играю с dhall, пытаясь представить существующий большой файл yaml, который у меня есть вместо этого в dhall.

В частности, я пытаюсь построить типы и помощники dhall для определения конвейера конкурса.Часть yaml, которая определяет конвейер конкурса, выглядит как yaml, который я написал здесь.Каждый ресурс в моем списке содержит имя, тип, а затем источник, структура которого полностью зависит от типа ресурса.

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

Здесь также видно, что у меня есть, но я не уверен, как я мог бы представить source.Я рассмотрел вопрос об исключении этого поля из моего типа и указании потребителям использовать оператор // dhall для добавления источника, но тогда становится трудно встраивать resource s в [resource] и по-прежнему проводить проверку типов.

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

resources:
- name: my-repo
  type: git
  source:
    $some_unstructured_yaml
{ name   : Text
, type   : Text
, source : Optional ???
}

1 Ответ

1 голос
/ 11 июля 2019

Это будет возможно в следующем выпуске (версия 1.3.1) dhall-json.

Например, для данной схемы:

-- This will become: https://prelude.dhall-lang.org/JSON/Type
let JSON = https://raw.githubusercontent.com/dhall-lang/dhall-lang/40c3e57a4f09448b5a7c9d203a81b64f50ed30bd/Prelude/JSON/Type

in  { name   : Text
    , type   : Text
    , source : Optional JSON
    }

... и эта конфигурация YAML:

name: my-repo
type: git
source:
  foo:
  - 1
  - bar: true
  baz: null

... он выдаст это выражение Дхалла:

$ yaml-to-dhall ./schema.dhall < example.yml
{ name =
    "my-repo"
, source =
    Some
    (   λ(JSON : Type)
      → λ ( json
          : { array :
                List JSON → JSON
            , bool :
                Bool → JSON
            , null :
                JSON
            , number :
                Double → JSON
            , object :
                List { mapKey : Text, mapValue : JSON } → JSON
            , string :
                Text → JSON
            }
          )
      → json.object
        [ { mapKey =
              "foo"
          , mapValue =
              json.array
              [ json.number 1.0
              , json.object [ { mapKey = "bar", mapValue = json.bool True } ]
              ]
          }
        , { mapKey = "baz", mapValue = json.null }
        ]
    )
, type =
    "git"
}

Для получения более подробной информации см. Следующее изменение стандарта:

... и следующее изменение в пакете dhall-json:

...