首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用dhall验证配置的内部一致性?

如何使用dhall验证配置的内部一致性?
EN

Stack Overflow用户
提问于 2019-12-03 19:54:57
回答 2查看 95关注 0票数 2

我将从一个激动人心的配置示例开始,它几乎代表了特使代理配置:)

代码语言:javascript
复制
virtual_hosts:
- name: webxp-api_http
  domains: ["*"]
  routes:
  - match: { prefix: "/static/v5.0" }
    route: { cluster: bodhi_static }
  - match: { prefix: "/"}
    route: { cluster: bodhi-web }

  clusters:
  - name: bodhi_web
  - name: bodhi_static

规则是,必须定义该名称clusters列表才能在配置的route部分中使用。如果仔细观察,该配置将无法加载,因为bodhi_web不是bodhi-web。我该如何在Dhall中编码它呢?

一方面,我可以将clusters作为let绑定中的一个列表,这会有所帮助,但并不会强迫我使用该绑定,实际上,我希望将clusters视为cluster:字段的一个sum类型?依赖类型对我有帮助吗(例如,我记得在purescript中做过这样的事情,对于依赖类型编程有一些有限的容量)

或者我应该只创建一个构造函数/验证器函数并滥用断言来验证它?

或者我就是不应该?:)

EN

回答 2

Stack Overflow用户

发布于 2019-12-05 00:58:12

我会通过编写一个实用函数来实现这一点,该函数可以生成按构造更正的配置。

以您的示例为例,如果我们想确保clusters字段下面的列表始终与路由列表匹配,那么我们从routes字段派生clusters字段:

代码语言:javascript
复制
let Prelude = https://prelude.dhall-lang.org/package.dhall

let Route = { match : { prefix : Text }, route : { cluster : Text } }

let toVirtualHosts =
          \(args : { name : Text, domains : List Text, routes : List Route })
      ->  { virtual_hosts =
                  args
              //  { clusters =
                      Prelude.List.map
                        Route
                        Text
                        (\(r : Route) -> r.route.cluster)
                        args.routes
                  }
          }

in  toVirtualHosts
      { name = "webxp-api_http"
      , domains = [ "*" ]
      , routes =
          [ { match = { prefix = "/static/v5.0" }
            , route = { cluster = "bodhi_static" }
            }
          , { match = { prefix = "/" }
            , route = { cluster = "bodhi_web" }
            }
          ]
      }
代码语言:javascript
复制
$ dhall-to-yaml --file ./example.dhall
virtual_hosts:
  clusters:
  - bodhi_static
  - bodhi_web
  domains:
  - *
  name: webxp-api_http
  routes:
  - match:
      prefix: /static/v5.0
    route:
      cluster: bodhi_static
  - match:
      prefix: /
    route:
      cluster: bodhi_web
票数 1
EN

Stack Overflow用户

发布于 2019-12-14 00:21:23

我的替代方案很大程度上依赖于这样一个事实,即当转换为yaml时,空的替代方案最终将是文本,即:{cluster = <static | web>.static}被解释为cluster: static

这意味着,我可以:

代码语言:javascript
复制
let Clusters = < bodhi_static | bodhi_web >

let Route =
      { Type = { match : { prefix : Text }, cluster : Clusters }
      , default = {=}
      }

let Cluster = { Type = { name : Clusters }, default = {=} }

in  { matches =
        [ Route::{ match = { prefix = "/" }, cluster = Clusters.bodhi_web }
        , Route::{
          , match = { prefix = "/static" }
          , cluster = Clusters.bodhi_static
          }
        ]
    , clusters =
        [ Cluster::{ name = Clusters.bodhi_static }
        , Cluster::{ name = Clusters.bodhi_web }
        ]
    }

更多的重复,但更简单的i.m.o?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59156540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档