///|
fn main {
  let template = match @uri_template.parse("/users/{id}{?fields*}") {
    Ok(value) => value
    Err(_) => abort("invalid template")
  }
  let contract = match
    template.with_contract([
      { name: "id", kind: TextValue, required: true, },
      { name: "fields", kind: ListValue, required: false, },
    ]) {
    Ok(value) => value
    Err(_) => abort("invalid contract")
  }
  if !(contract.expand([]) is Err(MissingRequired("id"))) {
    abort("required id must be checked before rendering")
  }
  if !(contract.expand([("id", List(["wrong shape"]))])
    is Err(WrongKind("id", TextValue))) {
    abort("list cannot replace a scalar id")
  }
  match
    contract.expand([
      ("id", Scalar("team/a")),
      ("fields", List(["name", "email"])),
    ]) {
    Ok(uri) => {
      if uri != "/users/team%2Fa?fields=name&fields=email" {
        abort("incorrect encoding")
      }
      println(uri)
    }
    Err(_) => abort("valid SDK arguments rejected")
  }
  println("Parameter contract: required, shape and encoding checks passed")
}