ps_ecc/
error.rs

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}