1#![allow(clippy::module_name_repetitions)]
2
3use std::{array::TryFromSliceError, num::TryFromIntError};
4
5use ps_buffer::BufferError;
6use thiserror::Error;
7
8#[derive(Error, Debug, Clone, Copy, Hash, PartialEq, Eq, PartialOrd, Ord)]
9pub enum GFError {
10 #[error("Division by zero is undefined.")]
11 DivByZero,
12}
13
14#[derive(Error, Debug, Clone, PartialEq, Eq)]
15pub enum PolynomialError {
16 #[error(transparent)]
17 BufferError(#[from] BufferError),
18 #[error(transparent)]
19 GFError(#[from] GFError),
20 #[error("Divisor cannot be zero.")]
21 ZeroDivisor,
22}
23
24#[derive(Error, Debug, Clone, Copy, Hash, PartialEq, Eq, PartialOrd, Ord)]
25pub enum RSConstructorError {
26 #[error("Parity count must be <= 127.")]
27 ParityTooHigh,
28}
29
30#[derive(Error, Debug, Clone, PartialEq, Eq)]
31pub enum RSGenerateParityError {
32 #[error(transparent)]
33 BufferError(#[from] BufferError),
34 #[error(transparent)]
35 PolynomialError(#[from] PolynomialError),
36}
37
38#[derive(Error, Debug, Clone, PartialEq, Eq)]
39pub enum RSEncodeError {
40 #[error(transparent)]
41 BufferError(#[from] BufferError),
42 #[error(transparent)]
43 RSGenerateParityError(#[from] RSGenerateParityError),
44}
45
46#[derive(Error, Debug, Clone, PartialEq, Eq)]
47pub enum RSValidationError {
48 #[error(transparent)]
49 BufferError(#[from] BufferError),
50}
51
52#[derive(Error, Debug, Clone, PartialEq, Eq)]
53pub enum RSEuclideanError {
54 #[error(transparent)]
55 BufferError(#[from] BufferError),
56 #[error(transparent)]
57 PolynomialError(#[from] PolynomialError),
58}
59
60#[derive(Error, Debug, Clone, PartialEq, Eq)]
61pub enum RSComputeErrorsError {
62 #[error(transparent)]
63 BufferError(#[from] BufferError),
64 #[error(transparent)]
65 GFError(#[from] GFError),
66 #[error(transparent)]
67 RSEuclideanError(#[from] RSEuclideanError),
68 #[error("Too many errors, input in unrecoverable.")]
69 TooManyErrors,
70 #[error("The error locator derivative evaluated to zero.")]
71 ZeroErrorLocatorDerivative,
72}
73
74#[derive(Error, Debug, Clone, PartialEq, Eq)]
75pub enum RSDecodeError {
76 #[error(transparent)]
77 BufferError(#[from] BufferError),
78 #[error(transparent)]
79 RSComputeErrorsError(#[from] RSComputeErrorsError),
80 #[error(transparent)]
81 RSConstructorError(#[from] RSConstructorError),
82 #[error(transparent)]
83 RSValidationError(#[from] RSValidationError),
84 #[error("Too many errors to correct. Error computation nevertheless returned a valid polynomial, which is unlikely. Usually you'll get RSComputeErrorsError(TooManyErrors) instead.")]
85 TooManyErrors,
86 #[error(transparent)]
87 TryFromIntError(#[from] TryFromIntError),
88}
89
90#[derive(Error, Debug, Clone, PartialEq, Eq)]
91pub enum EncodeError {
92 #[error(transparent)]
93 LongEccEncodeError(#[from] LongEccEncodeError),
94 #[error(transparent)]
95 RSConstructorError(#[from] RSConstructorError),
96 #[error(transparent)]
97 RSEncodeError(#[from] RSEncodeError),
98}
99
100#[derive(Error, Debug, Clone)]
101pub enum DecodeError {
102 #[error("Insufficient input bytes for parity count of {0}: {0} * 2 > {1}.")]
103 InsufficientParityBytes(u8, u8),
104 #[error(transparent)]
105 LongEccDecodeError(#[from] LongEccDecodeError),
106 #[error(transparent)]
107 RSConstructorError(#[from] RSConstructorError),
108 #[error(transparent)]
109 RSDecodeError(#[from] RSDecodeError),
110}
111#[derive(Error, Debug, Clone)]
112pub enum EccError {
113 #[error(transparent)]
114 EncodeError(#[from] EncodeError),
115 #[error(transparent)]
116 DecodeError(#[from] DecodeError),
117}
118
119#[derive(Error, Debug, Clone)]
120pub enum LongEccConstructorError {
121 #[error("Received {0} header bytes, {0} < 16.")]
122 InsufficientHeaderBytes(u8),
123 #[error(transparent)]
124 RSDecodeError(#[from] RSDecodeError),
125 #[error(transparent)]
126 TryFromIntError(#[from] TryFromIntError),
127 #[error(transparent)]
128 TryFromSliceError(#[from] TryFromSliceError),
129}
130
131#[derive(Error, Debug, Clone, PartialEq, Eq)]
132pub enum LongEccToBytesError {
133 #[error(transparent)]
134 RSConstructorError(#[from] RSConstructorError),
135 #[error(transparent)]
136 RSGenerateParityError(#[from] RSGenerateParityError),
137}
138
139#[derive(Error, Debug, Clone, PartialEq, Eq)]
140pub enum LongEccEncodeError {
141 #[error(transparent)]
142 BufferError(#[from] BufferError),
143 #[error("Parity {0} >= 64, which is too high.")]
144 InvalidParity(u8),
145 #[error("Invalid segment-to-parity ratio: {0} < 2 * {1}")]
146 InvalidSegmentParityRatio(u8, u8),
147 #[error(transparent)]
148 LongEccToBytesError(#[from] LongEccToBytesError),
149 #[error(transparent)]
150 RSConstructorError(#[from] RSConstructorError),
151 #[error(transparent)]
152 RSGenerateParityError(#[from] RSGenerateParityError),
153 #[error(transparent)]
154 TryFromIntError(#[from] TryFromIntError),
155}
156
157#[derive(Error, Debug, Clone)]
158pub enum LongEccDecodeError {
159 #[error(transparent)]
160 BufferError(#[from] BufferError),
161 #[error("Codeword is invalid.")]
162 InvalidCodeword,
163 #[error(transparent)]
164 LongEccConstructorError(#[from] LongEccConstructorError),
165 #[error("Failed to read data bytes.")]
166 ReadDataError,
167 #[error("Failed to read parity bytes.")]
168 ReadParityError,
169 #[error(transparent)]
170 RSDecodeError(#[from] RSDecodeError),
171 #[error(transparent)]
172 TryFromIntError(#[from] TryFromIntError),
173}