///|
fn main {
  try {
    let inputs = linked_pair()
    let datasets = inputs.map(input => @dicom.parse(input).dataset)
    let columns : Array[@query.Column] = [
      {
        name: "modality",
        path: [@query.Step::Field(@dicom.Tag::new(0x0008U, 0x0060U))],
      },
      {
        name: "rows",
        path: [@query.Step::Field(@dicom.Tag::new(0x0028U, 0x0010U))],
      },
    ]
    let selected = @query.select(datasets, [
      @query.Predicate::Equals(columns[0].path, "OT"),
      @query.Predicate::IntegerRange(columns[1].path, 2L, 2L),
    ])
    if selected != [0, 1] {
      abort("selection contract")
    }
    println(@query.summary(datasets, columns).stringify())
    println(@query.project(datasets, columns).private_csv())
    println(@query.project(datasets, columns).private_jsonl())
    let quality = @quality.check(inputs)
    if !quality.ready() {
      abort("quality contract")
    }
    println(quality.public_json().stringify())
    let options = @validation.ConversionOptions::new(
      policy=@policy.strict(),
      uid_seed="987654321",
      date_offsets=[7],
    )
    let plan = @validation.plan_collection(inputs, options)
    println(plan.public_report().stringify())
    let result = plan.execute()
    for i in 0.. abort("data pipeline failed")
  }
}