我正在玩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 ???
}
答案 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
软件包的以下更改: