noodles_sam/alignment/record_buf/
convert.rs

1use std::io;
2
3use super::{Data, RecordBuf};
4use crate::{alignment::Record, Header};
5
6impl RecordBuf {
7    /// Converts an alignment record to a buffer.
8    ///
9    /// # Examples
10    ///
11    /// ```
12    /// use noodles_sam::{self as sam, alignment::RecordBuf};
13    ///
14    /// let header = sam::Header::default();
15    /// let record = sam::Record::default();
16    ///
17    /// let record_buf = RecordBuf::try_from_alignment_record(&header, &record)?;
18    ///
19    /// assert_eq!(record_buf, RecordBuf::default());
20    /// # Ok::<_, std::io::Error>(())
21    /// ```
22    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}