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}