///|
/// Tabix (.tbi) index Demo.
///
/// Demonstrates the Rsamtools / htslib Tabix index port: parsing a `.tbi`
/// file (header fields + sequence names + per-reference binning) and querying
/// a half-open region for its compressed-block virtual offsets. The index data
/// is a canned (offline) fixture.
///|
fn main raise {
println("=== 1. Parse a Tabix (.tbi) index ===")
let idx = @src.parse_tabix(
@src.base64_decode(
"VEJJAQIAAAACAAAAAQAAAAIAAAAAAAAAIwAAAAAAAAAKAAAAY2hyMQBjaHIyAAEAAAAAAAAAAQAAADIAAAAAAAAAPAAAAAAAAAABAAAAMgAAAAAAAAABAAAAAAAAAAEAAABGAAAAAAAAAFAAAAAAAAAAAQAAAEYAAAAAAAAA",
),
)
println(
"n_ref = \{idx.n_ref}, format = \{idx.format}, meta = \{idx.meta}, skip = \{idx.skip}",
)
println("columns: seq=\{idx.col_seq}, beg=\{idx.col_beg}, end=\{idx.col_end}")
println("names = \{idx.names[0]}, \{idx.names[1]}")
println("\n=== 2. Query a region on ref 0 ===")
let q = @src.tabix_query(idx, 0, 0, 100)
println("min_off = \{q.min_off}")
for j = 0; j < q.chunks.length(); j = j + 1 {
let c = q.chunks[j]
println(" chunk [\{c.chunk_beg}, \{c.chunk_end})")
}
println("\n=== 3. Negative reference id is rejected ===")
let err = try {
ignore(@src.tabix_query(idx, -1, 0, 100))
""
} catch {
TabixError(msg) => msg
}
println("error: \{err}")
}