ipld_car/bounded_reader/
error.rs1use std::{io, ops::Range, sync::PoisonError};
2use thiserror::Error;
3
4use crate::bounded_reader::traits::Bounded;
5
6#[derive(Error, Debug)]
8pub enum BoundedReaderErr {
9 #[error("Bounded reader ({bounded_start}..{bounded_end}) len is to large with delta start `{delta_start}` and/or delta end `{delta_end}`")]
10 FileTooLarge { bounded_start: u64, bounded_end: u64, delta_start: u64, delta_end: u64 },
11 #[error("Sub bound start exceeds limits of original bounds")]
12 SubBoundStartExceedLimits { bounded_start: u64, bounded_end: u64, delta_start: u64 },
13 #[error("Sub bound end exceeds limits of original bounds")]
14 SubBoundEndExceedLimits { bounded_start: u64, bounded_end: u64, delta_end: u64 },
15 #[error("Range ({start}..{end}) is invalid, start MUST be less or equal to end")]
16 InvalidRange { start: u64, end: u64 },
17 #[error("Shared reader's mutex is poisoned")]
18 ReaderPoisoned,
19 #[error(transparent)]
20 Io(#[from] io::Error),
21 #[error("Range ({0}..{1}) is not supported by reader")]
22 RangeNotSupportedByReader(u64, u64),
23}
24
25impl BoundedReaderErr {
26 pub fn file_too_large<B: Bounded>(bounded: &B, delta_start: u64, delta_end: u64) -> Self {
27 let b = bounded.bounds();
28 Self::FileTooLarge { bounded_start: b.start, bounded_end: b.end, delta_start, delta_end }
29 }
30
31 pub fn sub_start_exceed<B: Bounded>(bounded: &B, delta_start: u64) -> Self {
32 let b = bounded.bounds();
33 Self::SubBoundStartExceedLimits { bounded_start: b.start, bounded_end: b.end, delta_start }
34 }
35
36 pub fn sub_end_exceed<B: Bounded>(bounded: &B, delta_end: u64) -> Self {
37 let b = bounded.bounds();
38 Self::SubBoundEndExceedLimits { bounded_start: b.start, bounded_end: b.end, delta_end }
39 }
40
41 #[inline]
42 pub const fn invalid_range(r: Range<u64>) -> Self {
43 Self::InvalidRange { start: r.start, end: r.end }
44 }
45
46 #[inline]
47 pub const fn range_not_supp(s: u64, e: u64) -> Self {
48 Self::RangeNotSupportedByReader(s, e)
49 }
50}
51
52impl<T> From<PoisonError<T>> for BoundedReaderErr {
53 #[inline]
54 fn from(_: PoisonError<T>) -> Self {
55 BoundedReaderErr::ReaderPoisoned
56 }
57}