let ImageResource
    : ∀(_params : { source : Type, get_params : Type, version : Type }) →
        { Type : Type
        , default :
            { params : Optional _params.get_params
            , version : Optional _params.version
            }
        }
    = λ(_params : { source : Type, get_params : Type, version : Type }) →
        { Type =
            { type : Text
            , source : _params.source
            , params : Optional _params.get_params
            , version : Optional _params.version
            }
        , default =
          { params = None _params.get_params, version = None _params.version }
        }
let Input =
      { Type = { name : Text, path : Optional Text, optional : Optional Bool }
      , default = { path = None Text, optional = None Bool }
      }
let Output =
      { Type = { name : Text, path : Optional Text }, default.path = None Text }
let Cache = { Type = { path : Text }, default = {=} }
let Run =
      { Type =
          { path : Text
          , args : Optional (List Text)
          , dir : Optional Text
          , user : Optional Text
          }
      , default = { args = None (List Text), dir = None Text, user = None Text }
      }
let ContainerLimits =
      { Type = { cpu : Optional Natural, memory : Optional Natural }
      , default = { cpu = None Natural, memory = None Natural }
      }
let Config
    : ∀(_params : { image_resource : Type }) →
        { Type : Type
        , default :
            { inputs : Optional (List Input.Type)
            , outputs : Optional (List Output.Type)
            , caches : Optional (List Cache.Type)
            , params : Optional (List { mapKey : Text, mapValue : Text })
            , rootfs_uri : Optional Text
            , container_limits : Optional ContainerLimits.Type
            }
        }
    = λ(_params : { image_resource : Type }) →
        { Type =
            { platform : Text
            , image_resource : _params.image_resource
            , inputs : Optional (List Input.Type)
            , outputs : Optional (List Output.Type)
            , caches : Optional (List Cache.Type)
            , params : Optional (List { mapKey : Text, mapValue : Text })
            , run : Run.Type
            , rootfs_uri : Optional Text
            , container_limits : Optional ContainerLimits.Type
            }
        , default =
          { inputs = None (List Input.Type)
          , outputs = None (List Output.Type)
          , caches = None (List Cache.Type)
          , params = None (List { mapKey : Text, mapValue : Text })
          , rootfs_uri = None Text
          , container_limits = None ContainerLimits.Type
          }
        }
let example =
      let RegistryImage = ./resource-types/RegistryImage.dhall
      let ImageResource =
            ImageResource
              { source = RegistryImage.Source.Type
              , get_params = <>
              , version = <>
              }
      let Config = Config { image_resource = ImageResource.Type }
      in  Config::{
          , platform = "linux"
          , image_resource = ImageResource::{
            , type = RegistryImage.meta.name
            , source = RegistryImage.Source::{ repository = "busybox" }
            }
          , params = Some (toMap { FOO = "hello" })
          , run = Run::{ path = "/bin/sh", args = Some [ "-ec", "echo \$FOO" ] }
          }
in  { ImageResource, Input, Output, Cache, Run, ContainerLimits, Config }