Skip to main content

ipld_car/bounded_reader/
error.rs

1use std::{io, ops::Range, sync::PoisonError};
2use thiserror::Error;
3
4use crate::bounded_reader::traits::Bounded;
5
6/// Errors that can occur when working with bounded readers.
7#[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}