1use std::{fmt::Display, num::TryFromIntError, sync::PoisonError};
2use thiserror::Error;
3
4#[derive(Error, Debug)]
5pub enum DataLakeError {
6 #[error(transparent)]
7 Alignment(#[from] AlignmentError),
8 #[error(transparent)]
9 DataStoreCorrupted(#[from] DataStoreCorrupted),
10 #[error("Hkey construction error: {0}")]
11 HkeyConstruction(#[from] ps_hkey::HkeyConstructionError),
12 #[error(transparent)]
13 Io(#[from] std::io::Error),
14 #[error(transparent)]
15 MmapMap(#[from] ps_mmap::MapError),
16 #[error("Tried to get a RW-handle on a read-only store.")]
17 MmapReadOnly,
18 #[error(transparent)]
19 Offset(#[from] OffsetError),
20 #[error(transparent)]
21 DataChunk(#[from] ps_datachunk::DataChunkError),
22 #[error(transparent)]
23 Hkey(#[from] ps_hkey::HkeyError),
24 #[error(transparent)]
25 TomlSer(#[from] Box<toml::ser::Error>),
26 #[error(transparent)]
27 TomlDeser(#[from] Box<toml::de::Error>),
28 #[error("Integer conversion error")]
29 TryFromInt(#[from] TryFromIntError),
30 #[error("Index out of range")]
31 Range,
32 #[error("DataChunk not found")]
33 NotFound,
34 #[error("Index overflowed - too many index buckets")]
35 IndexBucketOverflow,
36 #[error("The store being written to is read-only")]
37 DataStoreNotRw,
38 #[error("DataStore is out of space!")]
39 DataStoreOutOfSpace,
40 #[error("DataLake is out of available stores!")]
41 DataLakeOutOfStores,
42 #[error("Failed to acquire a poisoned mutex")]
43 MutexPoison,
44 #[error("Failed to store data")]
45 StorageFailure,
46 #[error("Invalid input format")]
47 Format,
48 #[error("To initialize a DataStore, please provision at least 64 kB of space.")]
49 InitFailedNotEnoughSpace(usize),
50}
51
52pub type Result<T> = std::result::Result<T, DataLakeError>;
53
54#[derive(Error, Debug)]
55pub struct AlignmentError;
56
57impl Display for AlignmentError {
58 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
59 f.write_str("DataStore is not memory-aligned properly.")
60 }
61}
62
63#[derive(Error, Debug)]
64pub enum OffsetError {
65 #[error(transparent)]
66 Alignment(#[from] AlignmentError),
67 #[error("Integer conversion error")]
68 TryFromInt(#[from] TryFromIntError),
69}
70
71impl<T> From<PoisonError<T>> for DataLakeError {
72 fn from(_: PoisonError<T>) -> Self {
73 Self::MutexPoison
74 }
75}
76
77impl From<ps_mmap::DerefError> for DataLakeError {
78 fn from(value: ps_mmap::DerefError) -> Self {
79 match value {
80 ps_mmap::DerefError::ReadOnly => Self::MmapReadOnly,
81 }
82 }
83}
84
85impl From<toml::ser::Error> for DataLakeError {
86 fn from(value: toml::ser::Error) -> Self {
87 Self::TomlSer(Box::from(value))
88 }
89}
90
91impl From<toml::de::Error> for DataLakeError {
92 fn from(value: toml::de::Error) -> Self {
93 Self::TomlDeser(Box::from(value))
94 }
95}
96
97#[derive(Clone, Debug, Error, Hash, PartialEq, Eq, PartialOrd, Ord)]
98pub enum DataStoreCorrupted {
99 #[error("DataStore has a size of {0} bytes")]
100 InvalidDataStoreSize(usize),
101 #[error("DataStore has an invalid file signature: {0}")]
102 InvalidMagic(String),
103 #[error("Index offset out of bounds: {0} > {1}")]
104 IndexOffsetOutOfBounds(u64, usize),
105 #[error("Data offset out of bounds: {0} > {1}")]
106 DataOffsetOutOfBounds(u64, usize),
107 #[error("Index ends out of bounds: {0} > {1}")]
108 IndexEndsOutOfBounds(usize, usize),
109 #[error("Data ends out of bounds: {0} > {1}")]
110 DataEndsOutOfBounds(usize, usize),
111 #[error("Index overlaps with data: {0} > {1}")]
112 IndexDataOverlap(usize, usize),
113 #[error("Index modulo {0} > index length {1}")]
114 IndexModuloTooSmall(u32, u32),
115}