Skip to main content

noodles_sam/header/record/value/map/
reference_sequence.rs

1//! SAM header record reference sequence map value.
2
3mod builder;
4pub mod md5_checksum;
5pub mod molecule_topology;
6pub mod tag;
7
8use std::num::NonZero;
9
10use self::builder::Builder;
11pub use self::md5_checksum::Md5Checksum;
12pub(crate) use self::tag::Tag;
13use super::{Inner, Map, OtherFields};
14
15/// A SAM header record reference sequence map value.
16///
17/// The reference sequence describes a sequence a read possibly mapped to. The length is guaranteed
18/// to be set.
19///
20/// A list of reference sequences creates a reference sequence dictionary.
21#[derive(Clone, Debug, Eq, PartialEq)]
22pub struct ReferenceSequence {
23    pub(crate) length: NonZero<usize>,
24}
25
26impl Inner for ReferenceSequence {
27    type StandardTag = tag::Standard;
28    type Builder = Builder;
29}
30
31impl Map<ReferenceSequence> {
32    /// Creates a reference sequence with a length.
33    ///
34    /// # Examples
35    ///
36    /// ```
37    /// use std::num::NonZero;
38    /// use noodles_sam::header::record::value::{map::ReferenceSequence, Map};
39    /// let reference_sequence = Map::<ReferenceSequence>::new(NonZero::try_from(13)?);
40    /// # Ok::<_, std::num::TryFromIntError>(())
41    /// ```
42    pub fn new(length: NonZero<usize>) -> Self {
43        Self {
44            inner: ReferenceSequence { length },
45            other_fields: OtherFields::new(),
46        }
47    }
48
49    /// Returns the reference sequence length.
50    ///
51    /// # Examples
52    ///
53    /// ```
54    /// use std::num::NonZero;
55    /// use noodles_sam::header::record::value::{map::ReferenceSequence, Map};
56    /// let reference_sequence = Map::<ReferenceSequence>::new(NonZero::try_from(13)?);
57    /// assert_eq!(usize::from(reference_sequence.length()), 13);
58    /// # Ok::<_, std::num::TryFromIntError>(())
59    /// ```
60    pub fn length(&self) -> NonZero<usize> {
61        self.inner.length
62    }
63
64    /// Returns a mutable reference to the reference sequence length.
65    ///
66    /// # Examples
67    ///
68    /// ```
69    /// use std::num::NonZero;
70    ///
71    /// use noodles_sam::header::record::value::{map::ReferenceSequence, Map};
72    ///
73    /// let length = NonZero::try_from(13)?;
74    /// let mut reference_sequence = Map::<ReferenceSequence>::new(length);
75    /// assert_eq!(reference_sequence.length(), length);
76    ///
77    /// let length = NonZero::try_from(8)?;
78    /// *reference_sequence.length_mut() = length;
79    /// assert_eq!(reference_sequence.length(), length);
80    /// # Ok::<_, std::num::TryFromIntError>(())
81    /// ```
82    pub fn length_mut(&mut self) -> &mut NonZero<usize> {
83        &mut self.inner.length
84    }
85}