如何处理 dhall 中的枚举?

How to handle enums in dhall?

我需要键入并生成包含字符串枚举值的配置。我设法定义了以下几行。最后我需要将联合转换为字符串值。

let ParameterLocation = < Query : {}
                        | Header : {}
                        | Path : {}
                        | Cookie : {}
                        >
let ParameterObject = {
                          name : Text,
                          `in` : ParameterLocation,
                          required : Bool
                      }
let locationToText = \(loc : ParameterLocation) -> merge {
       Query = \(_ : {}) -> "query",
       Header = \(_ : {}) -> "header",
       Path = \(_ : {}) -> "path",
       Cookie = \(_ : {}) -> "cookie"
    } loc
let t : ParameterObject = {
    name = "organisation_id",
    `in` = ParameterLocation.Query {=},
    required = False
 }
in t // { `in` = locationToText t.`in` }

此处包含 union/enum 的记录位于顶部,因此我可以很容易地访问它,但在最终配置中,ParameterObject 嵌套得非常深。

有没有办法

有人提议为此处的语言添加对具有空替代项(即枚举)的联合类型的支持,这将在几天内合并:

https://github.com/dhall-lang/dhall-lang/pull/438

合并后,该语言将支持更多自然枚举,如下所示:

let ParameterLocation = < Query
                        | Header
                        | Path
                        | Cookie
                        >

let locationToText = \(loc : ParameterLocation) -> merge {
       Query = "query",
       Header = "header",
       Path = "path",
       Cookie = "cookie"
    } loc

...

此外,dhall-to-jsondhall-to-yaml 将能够利用对空替代项的新内置支持,将替代名称呈现为字符串,而不是剥离标签。这应该在下一版本的标准(版本 7.0.0)和下一版本的 dhall-to-json/dhall-to-yaml (1.2.8) 中可用。