在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”等),但值的类型相同。我相信这是一个相当普遍的用例,但我在教程中没有看到它的讨论。
答案 0 :(得分:4)
您可以在前奏中使用Map
,defined,在语言导览中使用discussed。
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对象。