///|
/// SeqIO index demo (port of Biopython Bio.SeqIO.index):
/// scan a FASTA file once, map record ids to byte offsets, then fetch
/// individual records by id without re-parsing the whole file.
fn main {
  let fasta = ">BRCA1 human breast cancer gene\n" +
    "ATGGATTTATCTGCTCTTCGCGTTGAAGAAGTACAAAATGTCATTAATGCTATGCAGAAAATCTTAGAG\n" +
    "CGTCCCTGGTCTTCAGGGACTAATATTATCATTTGTAGT\n" +
    ">TP53 tumor suppressor\n" +
    "ATGGAGGAGCCGCAGTCAGATCCTAGCGTCGAGCCCCCTCTGAGTCAGGAAACATTTTCAGACCTATGGAA\n" +
    "ACTACTTCCTGAAAACAACGTTCTGTCCCCCTTGCCGTCC\n" +
    ">EGFR\n" +
    "ATGCGACCCTCCGGGACGGCCGGGGCAGCGCTCCTGGCGCTGCTGGCTGCGCTCTGCCCGGCGAGTCGGG\n" +
    "CTCTGGAGGAAAAGAAAGTTTGCCAAGGCACGAGTAACAAG\n"

  // ---- Build the index ----------------------------------------------------
  let index = @src.seqio_index(fasta, "fasta") catch {
    @src.SeqIOError(msg) => {
      println("indexing failed: " + msg)
      return
    }
  }

  println("indexed " + index.length().to_string() + " records")
  let keys = index.keys()
  let mut i = 0
  while i < keys.length() {
    println("  " + keys[i])
    i = i + 1
  }
  println("contains TP53: " + index.contains("TP53").to_string())

  // ---- Random access by id -----------------------------------------------
  let ids = ["EGFR", "BRCA1"]
  let mut j = 0
  while j < ids.length() {
    let id = ids[j]
    try {
      let raw = index.get_raw(fasta, id)
      let record = index.get(fasta, id)
      println("")
      println(
        "--- record " + id + " (" + raw.length().to_string() + " raw bytes) ---",
      )
      println("description : " + record.description)
      println(
        "sequence    : " +
        record.seq.to_string()[0:30].to_owned() +
        "... (" +
        record.seq.to_string().length().to_string() +
        " bp)",
      )
    } catch {
      @src.SeqIOError(msg) => println("failed to fetch " + id + ": " + msg)
    }
    j = j + 1
  }
}