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