是否可以从_within_ dhall 表达式创建 YAML?

Is it possible to create YAML from _within_ a dhall expression?

我想使用 dhall-kubernetes 为服务生成 ConfigMap。该服务是使用 YAML 文件配置的。我可以使用 dhall 分两次创建配置:

$ dhall-to-yaml < server.dhall > server.yaml
$ dhall-to-yaml < configmap.dhall 
apiVersion: v1
data:
  server.yaml: |
    server:
      port: 8080
kind: ConfigMap
metadata:
  name: my-configmap

server.dhall:

let _config = { server.port = 8080 } in _config

configmap.dhall:

let kubernetes =
      ./package.dhall sha256:d9eac5668d5ed9cb3364c0a39721d4694e4247dad16d8a82827e4619ee1d6188

let _configMap1 =
      kubernetes.ConfigMap::{
      , metadata = kubernetes.ObjectMeta::{ name = "my-configmap" }
      , data = Some
        [ { mapKey = "server.yaml", mapValue = ./server.yaml as Text } ]
      }

in  _configMap1

package.dhall

https://raw.githubusercontent.com/dhall-lang/dhall-kubernetes/master/package.dhall

是否可以通过从 dhall 中生成 YAML 来仅调用一次 dhall-to-yaml?像这样:

let kubernetes =
      ./package.dhall sha256:d9eac5668d5ed9cb3364c0a39721d4694e4247dad16d8a82827e4619ee1d6188

let _config = { server.port = 8080 }

let _configMap3 =
      kubernetes.ConfigMap::{
      , metadata = kubernetes.ObjectMeta::{ name = "my-configmap" }
      , data = Some
        [ { mapKey = "server.yaml"
          , mapValue = makeYAML _config -- make this work 
          }   
        ]   
      }   

in  _configMap3

我从 Prelude 中找到了 JSON.renderYAML 函数,但这似乎并不是我们所需要的。

要使用 Prelude.JSON.renderYAML 生成 YAML,您首先需要将配置转换为输入 Prelude.JSON.Type 类型。请参阅下面我的 makeYAML 版本中包含的 makeJSON 函数:

let Prelude = https://prelude.dhall-lang.org/v15.0.0/package.dhall

let J = Prelude.JSON

let Config = { server : { port : Natural } }

let makeJSON
    : Config → J.Type
    =   λ(c : Config)
      → J.object
          ( toMap
              { server = J.object (toMap { port = J.natural c.server.port }) }
          )

let makeYAML
    : Config → Text
    = λ(c : Config) → J.renderYAML (makeJSON c)

let example =
      let _config
          : Config
          = { server.port = 8080 }

      in    assert
          :   makeYAML _config
            ≡ ''
              "server":
                "port": 8080
              ''

in  makeYAML