///|
/// CRAM format parsing example.
///
/// Demonstrates CRAM format parsing, checking magic numbers,
/// and available API functions.
///
/// Run: moon run examples/cram_demo/main.mbt
fn main {
println("=== CRAM Format Parsing Demo ===")
println("")
println("1. Checking CRAM magic number...")
let valid_cram = "CRAM"
let invalid = "BAM\u{0001}"
println(" Is CRAM magic ('CRAM'): \{@bio.is_cram_magic(valid_cram)}")
println(" Is CRAM magic ('BAM...'): \{@bio.is_cram_magic(invalid)}")
println("")
println("2. CRAM Data Structures Overview...")
println("")
println(" CramVersion:")
println(" - major: Int")
println(" - minor: Int")
println("")
println(" CramCompression:")
println(" - None: No compression")
println(" - Gzip: Gzip compression")
println(" - Bzip2: Bzip2 compression")
println(" - Lzma: Lzma compression")
println(" - Unknown(code): Unknown compression type")
println("")
println(" CramReference:")
println(" - name: String")
println(" - length: Int")
println(" - md5: String")
println(" - uri: String")
println("")
println(" CramHeader:")
println(" - version: CramVersion")
println(" - reference_count: Int")
println(" - references: Array[CramReference]")
println(" - compression: CramCompression")
println(" - stream_count: Int")
println(" - stream_info: Array[String]")
println(" - sam_header: String")
println("")
println(" CramReadFeatures:")
println(" - read_group: Int")
println(" - flags: Int")
println(" - mapping_quality: Int")
println(" - read_name: String")
println(" - cigar: Array[BamCigarElement]")
println(" - sequence: String")
println(" - quality: String")
println(" - tags: Array[String]")
println("")
println(" CramRecord:")
println(" - ref_id: Int")
println(" - pos: Int")
println(" - read_features: CramReadFeatures")
println("")
println(" CramFile:")
println(" - header: CramHeader")
println(" - records: Array[CramRecord]")
println("")
println("3. Available CRAM Functions...")
println("")
println(" Magic Number Detection:")
println(" is_cram_magic(data): Bool")
println("")
println(" Parsing Functions:")
println(" parse_cram(data): CramFile raise CramError")
println(" parse_cram_base64(base64): CramFile raise CramError")
println(" try_parse_cram_base64(base64): CramFile?")
println("")
println(" CramFile Methods:")
println(" .len(): Int")
println(" .num_references(): Int")
println(" .get_reference_names(): Array[String]")
println(" .get_reference_length(name): Int")
println(" .to_bam(): BamFile")
println("")
println(" CramRecord Methods:")
println(" .is_paired(): Bool")
println(" .is_proper_pair(): Bool")
println(" .is_unmapped(): Bool")
println(" .is_reverse(): Bool")
println(" .is_read1(): Bool")
println(" .is_read2(): Bool")
println(" .get_reference_name(header): String")
println("")
println("4. CRAM to BAM Conversion...")
println("")
println(" CRAM files can be converted to BAM for interoperability:")
println(" let cram = parse_cram(data)")
println(" let bam = cram.to_bam()")
println(" let sam = bam.to_sam()")
println("")
println("5. CRAM vs BAM Comparison...")
println("")
println(" Feature | CRAM | BAM")
println(" ---------------- |-------------|-------")
println(" Magic Number | CRAM\\0 | BAM\\1")
println(" Compression | Built-in | BGZF")
println(" Reference | Embedded | External")
println(" Compression Ratio| Higher | Lower")
println(" Read Speed | Slower | Faster")
println(" File Size | Smaller | Larger")
println("")
println("6. Usage Example...")
println("")
println(" let cram_data = ...")
println(" if is_cram_magic(cram_data) {")
println(" let cram = parse_cram(cram_data)")
println(" println('References: ' ++ cram.num_references().show())")
println(" println('Records: ' ++ cram.len().show())")
println(" let bam = cram.to_bam()")
println(" // Process BAM records...")
println(" }")
println("")
println("=== Done ===")
}