///|
/// UniProt XML Format IO Demo.
///
/// Demonstrates parsing UniProt XML entries and extracting annotations.
///
/// Run: moon run examples/uniprot_io_demo/main.mbt
fn main {
println("=== UniProt XML IO Demo ===\n")
// Example UniProt XML content
let uniprot_xml = "\n" +
" \n" +
" P12345\n" +
" Hemoglobin subunit alpha\n" +
" HBA1\n" +
" 9606Homo sapiens\n" +
" VLSPADKTNVKAAWGKVGAHAGEYGAEALERMFLSFPTTKTYFPHFDLSHGSAQVKGHGKKVADALTNAVAHVDDMPNALSALSDLHAHKLRVDPVNFKLLSHCLLVTLAAHLPAEFTPAVHASLDKFLASVSTVLTSKYR\n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" test\n" +
" test\n" +
" \n" +
" \n" +
" \n" +
" \n" +
" Cytoplasm\n" +
" \n" +
" \n" +
" \n" +
" "
// Parse UniProt XML
println("1. Parse UniProt XML:")
let entries = @bio.parse_uniprot_xml(uniprot_xml)
println(" Found \{entries.length()} entries")
if entries.length() > 0 {
let entry = entries[0]
println("\n2. Entry details:")
println(" Accession: \{entry.accession}")
println(" Protein: \{entry.protein_name}")
println(" Organism: \{entry.organism}")
println(" Sequence length: \{entry.seq_length}")
let seq_str = entry.sequence
let prefix = if seq_str.length() > 20 {
seq_str[0:20] + "..."
} else {
seq_str
}
println(" Sequence (first 20 chars): \{prefix}")
println("\n3. Gene names:")
for g in entry.gene_names {
println(" - \{g}")
}
println("\n4. Database references:")
for db in entry.db_references {
println(" - \{db.database}: \{db.id}")
}
println("\n5. Features:")
for f in entry.features {
println(" - \{f.feature_type}: \{f.description}")
}
println("\n6. Convert to SeqRecord-compatible format:")
let (header, id, desc, _kwargs) = @bio.uniprot_to_seqrecord(entry)
println(" Header: \{header}")
println(" ID: \{id}")
println(" Description: \{desc}")
}
println("\n=== Demo Complete ===")
}