ps_datalake/
error.rs

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}