1#![allow(unused, clippy::must_use_candidate)]
47#![allow(dead_code)]
48
49mod read_segment;
50mod read_structure;
51mod segment_type;
52
53pub use crate::read_structure::*;
54pub use read_segment::*;
55pub use segment_type::*;
56use thiserror::Error;
57
58#[derive(Debug, Error)]
59pub enum ReadStructureError {
60 #[error("Example")]
61 Example,
62
63 #[error("Invalid read structure: {0}")]
64 InvalidReadStructure(String),
65
66 #[error("Mismatching bases and quals lengths: {bases_len}, {quals_len}")]
67 MismatchingBasesAndQualsLen { bases_len: usize, quals_len: usize },
68
69 #[error("Read structure missing length information: {}[{}]{}", .0.prefix, .0.error, .0.suffix)]
70 ReadStructureMissingLengthInformation(ErrorMessageParts),
71
72 #[error("Read structure missing operator: {}[{}]{}", .0.prefix, .0.error, .0.suffix)]
73 ReadStructureMissingOperator(ErrorMessageParts),
74
75 #[error("Read structure had unknown type: {}[{}]{}", .0.prefix, .0.error, .0.suffix)]
76 ReadStructureHadUnknownType(ErrorMessageParts),
77
78 #[error("Read structure contains zero elements")]
79 ReadStructureContainsZeroElements,
80
81 #[error("Read structure contains a non-terminal segment that has an indefinite length: {0}")]
82 ReadStructureNonTerminalIndefiniteLengthReadSegment(ReadSegment),
83
84 #[error("Read ends before start of segment: {0}")]
85 ReadEndsBeforeSegment(ReadSegment),
86
87 #[error("Read ends before end of segment: {0}")]
88 ReadEndsAfterSegment(ReadSegment),
89
90 #[error("ReadSegment too short: {0}")]
91 ReadSegmentTooShort(String),
92
93 #[error("ReadSegment str contained more than one segment: {0}")]
94 ReadSegmentMultipleSegments(String),
95
96 #[error("ReadSegment must have length > 0 or `+`: {}[{}]{}", .0.prefix, .0.error, .0.suffix)]
97 ReadSegmentLengthZero(ErrorMessageParts),
98
99 #[error("Invalid SegementType: {0}")]
100 ReadSegmentTypeInvalid(char),
101}
102
103#[derive(Debug)]
105pub struct ErrorMessageParts {
106 prefix: String,
107 error: String,
108 suffix: String,
109}
110
111impl ErrorMessageParts {
112 fn new(chars: &[char], start: usize, end: usize) -> Self {
113 let prefix: String = chars.iter().take(start).collect();
114 let error: String = chars.iter().skip(start).take(end - start).collect();
115 let suffix: String = if end == chars.len() {
116 "".to_string()
117 } else {
118 chars.iter().skip(end).take(chars.len() - end).collect()
119 };
120 Self { prefix, error, suffix }
121 }
122}