Как закодировать объединение на подмножестве полей, используя Dhall? - PullRequest
0 голосов
/ 23 января 2020

Я пытаюсь использовать Dhall для генерации AWS облачной информации, и первое, что я пытаюсь кодировать, это AWS :: ApiGatewayV2 :: Api . Который имеет следующее json spe c:

{
  "Type" : "AWS::ApiGatewayV2::Api",
  "Properties" : {
    "ApiKeySelectionExpression" : String,
    "BasePath" : String,
    "Body" : Json,
    "BodyS3Location" : BodyS3Location,
    "CorsConfiguration" : Cors,
    "CredentialsArn" : String,
    "Description" : String,
    "DisableSchemaValidation" : Boolean,
    "FailOnWarnings" : Boolean,
    "Name" : String,
    "ProtocolType" : String,
    "RouteKey" : String,
    "RouteSelectionExpression" : String,
    "Tags" : Json,
    "Target" : String,
    "Version" : String
  }
}

В спецификации есть несколько полей, но два из них образуют объединение: BodyS3Location и Body. Означают, что любой из них должен присутствовать. Я знаю о поддержке dynamici c records , но, очевидно, работает только для объектов с одной записью. Каков был бы рекомендуемый способ кодировать это поведение?

1 Ответ

1 голос
/ 24 января 2020

Это может не очень хорошо обобщать, но для этого конкретного примера c вы можете сделать это:

let JSON = https://prelude.dhall-lang.org/v12.0.0/JSON/package.dhall

-- These are just placeholders for whatever the real types are
let BodyS3Location = {}

let Cors = {}

let Shared =
      { ApiKeySelectionExpression : Text
      , BasePath : Text
      , CorsConfiguration : Cors
      , CredentialsArn : Text
      , Description : Text
      , DisableSchemaValidation : Bool
      , FailOnWarnings : Bool
      , Name : Text
      , ProtocolType : Text
      , RouteKey : Text
      , RouteSelectionExpression : Text
      , Tags : JSON.Type
      , Target : Text
      , Version : Text
      }

in  < A : Shared //\\ { BodyS3Location : BodyS3Location }
    | B : Shared //\\ { Body : JSON.Type }
    >
...