noodles_sam/alignment/record_buf/
convert.rs1use std::io;
2
3use super::{Data, RecordBuf};
4use crate::{alignment::Record, Header};
5
6impl RecordBuf {
7 pub fn try_from_alignment_record<R>(header: &Header, record: &R) -> io::Result<Self>
23 where
24 R: Record,
25 {
26 let mut record_buf = RecordBuf::default();
27
28 *record_buf.name_mut() = record.name().map(|name| name.into());
29 *record_buf.flags_mut() = record.flags()?;
30 *record_buf.reference_sequence_id_mut() =
31 record.reference_sequence_id(header).transpose()?;
32 *record_buf.alignment_start_mut() = record.alignment_start().transpose()?;
33 *record_buf.mapping_quality_mut() = record.mapping_quality().transpose()?;
34 *record_buf.cigar_mut() = record.cigar().iter().collect::<io::Result<_>>()?;
35 *record_buf.mate_reference_sequence_id_mut() =
36 record.mate_reference_sequence_id(header).transpose()?;
37 *record_buf.mate_alignment_start_mut() = record.mate_alignment_start().transpose()?;
38 *record_buf.template_length_mut() = record.template_length()?;
39 *record_buf.sequence_mut() = record.sequence().iter().collect::<Vec<_>>().into();
40 *record_buf.quality_scores_mut() = record
41 .quality_scores()
42 .iter()
43 .collect::<io::Result<Vec<_>>>()?
44 .into();
45
46 let mut data_buf = Data::default();
47
48 for result in record.data().iter() {
49 let (tag, value) = result?;
50 data_buf.insert(tag, value.try_into()?);
51 }
52
53 *record_buf.data_mut() = data_buf;
54
55 Ok(record_buf)
56 }
57}