Я пытаюсь представить конвейерную систему проекта Zuul-CI, используя типы Dhall: конвейер может использовать разные соединения с разными триггерными событиями.
Я хотел бы предоставить конвейер по умолчанию, который устанавливаетправильное событие триггера для каждого типа соединений таким образом, что:
⊢ RenderPipeline CheckPipeline::{ connections = [ ConnectionTypes.GitHub ] }
- pipeline:
name: check
trigger:
github:
action: open
event: pull-request
⊢ RenderPipeline CheckPipeline::{ connections = [ ConnectionTypes.Gerrit ] }
- pipeline:
name: check
trigger:
gerrit:
event: patchset-created
⊢ RenderPipeline CheckPipeline::{ connections = [ ConnectionTypes.Gerrit, ConnectionTypes.GitHub ] }
- pipeline:
name: check
trigger:
gerrit:
event: patchset-created
github:
action: open
event: pull-request
Мне пришлось использовать Union for ConnectionTrigger, потому что функция слияния ожидает, что значение будет одного типа.
Есть ли способ каким-либо образом связать GerritTrigger с ConnectionTypes.Gerrit и не вводить тип события в определении CheckPipeline (например, удалить аннотацию ConnectionTrigger.Gerrit)?
let Prelude =
https://raw.githubusercontent.com/dhall-lang/dhall-lang/v11.1.0/Prelude/package.dhall sha256:99462c205117931c0919f155a6046aec140c70fb8876d208c7c77027ab19c2fa
let ConnectionTypes
: Type
= < Gerrit | GitHub >
let GerritTrigger
: Type
= { event : Text }
let GitHubTrigger
: Type
= { event : Text, action : Text }
let ConnectionTrigger
: Type
= < Gerrit : GerritTrigger | GitHub : GitHubTrigger >
let Pipeline
: Type
= { name : Text
, trigger : { Gerrit : ConnectionTrigger, GitHub : ConnectionTrigger }
, connections : List ConnectionTypes
}
let CheckPipeline =
{ Type = Pipeline
, default =
{ name = "check"
, trigger =
-- "Here, can this be improved so that Gerrit is not mentioned twice?"
{ Gerrit = ConnectionTrigger.Gerrit { event = "patchset-created" }
, GitHub =
ConnectionTrigger.GitHub
{ event = "pull-request", action = "open" }
}
}
}
let PipelineRenderTrigger
: Type
= { mapKey : Text, mapValue : ConnectionTrigger }
let RenderPipeline =
λ(pipeline : Pipeline)
→ [ { pipeline =
{ name = pipeline.name
, trigger =
Prelude.List.map
ConnectionTypes
PipelineRenderTrigger
( λ(connection : ConnectionTypes)
→ { mapKey =
merge
{ Gerrit = "gerrit", GitHub = "github" }
connection
, mapValue = merge pipeline.trigger connection
}
)
pipeline.connections
}
}
]
in RenderPipeline CheckPipeline::{ connections = [ ConnectionTypes.GitHub ] }
Заранее спасибо:)