read_structure/
segment_type.rs1use std::{convert::TryFrom, mem};
7
8use strum::IntoEnumIterator;
9use strum_macros::EnumIter;
10
11use crate::ReadStructureError;
12
13#[non_exhaustive]
15#[derive(Debug, Copy, Clone, EnumIter, PartialEq, Eq, Hash, PartialOrd, Ord)]
16#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
17#[repr(u8)]
18pub enum SegmentType {
19 Template = b'T',
21 SampleBarcode = b'B',
23 MolecularBarcode = b'M',
25 Skip = b'S',
27 CellularBarcode = b'C',
29}
30
31impl SegmentType {
32 pub fn value(&self) -> char {
34 let value = *self as u8;
35 value as char
36 }
37}
38
39impl TryFrom<char> for SegmentType {
40 type Error = ReadStructureError;
41
42 fn try_from(value: char) -> Result<Self, Self::Error> {
48 match value {
49 'T' => Ok(SegmentType::Template),
50 'B' => Ok(SegmentType::SampleBarcode),
51 'M' => Ok(SegmentType::MolecularBarcode),
52 'S' => Ok(SegmentType::Skip),
53 'C' => Ok(SegmentType::CellularBarcode),
54 _ => Err(ReadStructureError::ReadSegmentTypeInvalid(value)),
55 }
56 }
57}
58
59impl TryFrom<u8> for SegmentType {
60 type Error = ReadStructureError;
61
62 fn try_from(value: u8) -> Result<Self, Self::Error> {
68 Self::try_from(value as char)
69 }
70}
71
72#[cfg(test)]
73mod test {
74 use std::convert::TryFrom;
75
76 use crate::{segment_type::SegmentType, ReadStructureError};
77 use strum::IntoEnumIterator;
78
79 #[test]
80 fn test_segment_type_round_trip() -> Result<(), ReadStructureError> {
81 assert_eq!(SegmentType::iter().len(), 5);
82 for tpe in SegmentType::iter() {
83 assert_eq!(SegmentType::try_from(tpe.value())?, tpe);
84 }
85 Ok(())
86 }
87
88 #[test]
89 fn test_invalid_segment_type() {
90 assert!(SegmentType::try_from(b'G').is_err());
91 }
92}