1use std::sync::PoisonError;
2use thiserror::Error;
3
4#[derive(Error, Debug)]
5pub enum PsDataLakeError {
6 #[error(transparent)]
7 DataStoreCorrupted(#[from] DataStoreCorrupted),
8 #[error(transparent)]
9 IoError(#[from] std::io::Error),
10 #[error(transparent)]
11 MmapMapError(#[from] ps_mmap::MapError),
12 #[error("Tried to get a RW-handle on a read-only store.")]
13 MmapReadOnly,
14 #[error(transparent)]
15 PsDataChunkError(#[from] ps_datachunk::PsDataChunkError),
16 #[error(transparent)]
17 PsHashError(#[from] ps_hash::PsHashError),
18 #[error(transparent)]
19 PsHkeyError(#[from] ps_hkey::PsHkeyError),
20 #[error(transparent)]
21 TomlSerError(#[from] Box<toml::ser::Error>),
22 #[error(transparent)]
23 TomlDeError(#[from] Box<toml::de::Error>),
24 #[error("Index out of range")]
25 RangeError,
26 #[error("DataChunk not found")]
27 NotFound,
28 #[error("Index overflowed - too many index buckets")]
29 IndexBucketOverflow,
30 #[error("The store being written to is read-only")]
31 DataStoreNotRw,
32 #[error("DataStore is out of space!")]
33 DataStoreOutOfSpace,
34 #[error("DataLake is out of available stores!")]
35 DataLakeOutOfStores,
36 #[error("Failed to acquire a poisoned mutex")]
37 MutexPoisonError,
38 #[error("Failed to store data")]
39 StorageFailure,
40 #[error("Invalid input format")]
41 FormatError,
42 #[error("To initialize a DataStore, please provision at least 64 kB of space.")]
43 InitFailedNotEnoughSpace(usize),
44}
45
46pub type Result<T> = std::result::Result<T, PsDataLakeError>;
47
48impl<T> From<PoisonError<T>> for PsDataLakeError {
49 fn from(_: PoisonError<T>) -> Self {
50 Self::MutexPoisonError
51 }
52}
53
54impl From<ps_mmap::DerefError> for PsDataLakeError {
55 fn from(value: ps_mmap::DerefError) -> Self {
56 match value {
57 ps_mmap::DerefError::ReadOnly => Self::MmapReadOnly,
58 }
59 }
60}
61
62impl From<toml::ser::Error> for PsDataLakeError {
63 fn from(value: toml::ser::Error) -> Self {
64 Self::TomlSerError(Box::from(value))
65 }
66}
67
68impl From<toml::de::Error> for PsDataLakeError {
69 fn from(value: toml::de::Error) -> Self {
70 Self::TomlDeError(Box::from(value))
71 }
72}
73
74#[derive(Clone, Debug, Error, Hash, PartialEq, Eq, PartialOrd, Ord)]
75pub enum DataStoreCorrupted {
76 #[error("DataStore has a size of {0} bytes")]
77 InvalidDataStoreSize(usize),
78 #[error("DataStore has an invalid file signature: {0}")]
79 InvalidMagic(String),
80 #[error("Index offset out of bounds: {0} > {1}")]
81 IndexOffsetOutOfBounds(u64, usize),
82 #[error("Data offset out of bounds: {0} > {1}")]
83 DataOffsetOutOfBounds(u64, usize),
84 #[error("Index ends out of bounds: {0} > {1}")]
85 IndexEndsOutOfBounds(usize, usize),
86 #[error("Data ends out of bounds: {0} > {1}")]
87 DataEndsOutOfBounds(usize, usize),
88 #[error("Index overlaps with data: {0} > {1}")]
89 IndexDataOverlap(usize, usize),
90 #[error("Index modulo {0} > index length {1}")]
91 IndexModuloTooSmall(u32, u32),
92}