dhall-to-yaml:表示嵌套在结构化yaml中的非结构化块

时间:2019-05-12 11:00:58

标签: yaml dhall

我正在玩dhall,试图代表dhall中已有的现有大Yaml文件。

具体来说,我正在尝试为大厅管道定义构建dhall类型和助手。定义会话管道的Yaml的一部分看起来像我在这里编写的Yaml。我列表中的每个资源都包含一个名称,一个类型,然后是一个源,其结构完全取决于资源的类型。

我没有定义详尽的资源列表,因为有人明天可以创建一个新的资源,并且我不想每次第三方创建新的源类型时都更新我的类型。

我在这方面也有过之而无不及,但我不确定如何代表source。我曾考虑过从我的类型中忽略此字段,并指示消费者使用dhall的//运算符添加源,但是随后很难将resource嵌入[resource]中并且仍然具有类型检查。

如何为其中包含非结构化值的字段的资源定义dhall类型。

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

1 个答案:

答案 0 :(得分:0)

dhall-json的下一发行版(1.3.1版)中可能会出现这种情况。

例如,给定以下架构:

-- 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

...它将产生以下Dhall表达式:

$ 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软件包的以下更改: