///|
/// Bio.KEGG.REST Demo.
///
/// Demonstrates the REST-style KEGG API client (info / list / find / get /
/// conv / link) with an injected transport, so the URL construction and the
/// three-queries-per-second rate limiting can be shown without any network
/// access.

///|
fn main raise {
  let log : Array[String] = []
  let client = @src.KeggRestClient::new(
    fetch=fn(url) {
      log.push(url)
      "(simulated response for \{url})"
    },
    now=fn() { 0.0 },
  )

  println("=== URL construction ===")
  println(@src.kegg_rest_url("list", "pathway", arg2="hsa"))
  println(@src.kegg_rest_url("get", "hsa:10458", arg2="aaseq"))

  println("\n=== 1. info: database statistics ===")
  println(@src.kegg_rest_info(client, "pathway"))

  println("\n=== 2. list: entry lists ===")
  println(@src.kegg_rest_list(client, "pathway", org="hsa"))
  println(@src.kegg_rest_list_entries(client, ["hsa:10458", "hsa:10459"]))

  println("\n=== 3. find: keyword and chemical searches ===")
  println(@src.kegg_rest_find(client, "genes", "shiga toxin"))
  println(
    @src.kegg_rest_find(client, "compound", "C00001", option="exact_mass"),
  )

  println("\n=== 4. get: entry retrieval ===")
  println(@src.kegg_rest_get(client, "hsa:10458", option="aaseq"))
  println(
    @src.kegg_rest_get_multi(client, ["hsa:10458", "hsa:10459"], option="ntseq"),
  )

  println("\n=== 5. conv: cross-database identifier conversion ===")
  println(@src.kegg_rest_conv(client, "uniprot", "hsa"))
  println(@src.kegg_rest_conv_multi(client, "compound", ["pubchem"]))

  println("\n=== 6. link: related entries via cross-references ===")
  println(@src.kegg_rest_link(client, "pathway", "hsa:10458"))
  println(@src.kegg_rest_link_multi(client, "genes", ["dru:D00109"]))

  println("\n=== Issued requests (rate limited to 3/second) ===")
  for url in log {
    println(url)
  }

  println("\nDone.")
}