Skip to main content

gluesql_parquet_storage/
error.rs

1use {gluesql_core::prelude::Error, thiserror::Error};
2
3pub trait ResultExt<T, E: ToString> {
4    /// Convert an external error into a `GlueSQL` storage error.
5    ///
6    /// # Errors
7    ///
8    /// Returns `Error::StorageMsg` when the result contains an error.
9    fn map_storage_err(self) -> Result<T, Error>;
10}
11
12impl<T, E: ToString> ResultExt<T, E> for std::result::Result<T, E> {
13    fn map_storage_err(self) -> Result<T, Error> {
14        self.map_err(|e| e.to_string()).map_err(Error::StorageMsg)
15    }
16}
17
18pub trait OptionExt<T, E: ToString> {
19    /// Convert a missing option into a `GlueSQL` storage error.
20    ///
21    /// # Errors
22    ///
23    /// Returns `Error::StorageMsg` when the option is `None`.
24    fn map_storage_err(self, error: E) -> Result<T, Error>;
25}
26
27impl<T, E: ToString> OptionExt<T, E> for std::option::Option<T> {
28    fn map_storage_err(self, error: E) -> Result<T, Error> {
29        self.ok_or_else(|| error.to_string())
30            .map_err(Error::StorageMsg)
31    }
32}
33
34impl From<ParquetStorageError> for Error {
35    fn from(error: ParquetStorageError) -> Self {
36        Self::StorageMsg(error.to_string())
37    }
38}
39
40#[derive(Error, Debug)]
41pub enum ParquetStorageError {
42    #[error("file not found")]
43    FileNotFound,
44
45    #[error("table {0} does not exist")]
46    TableDoesNotExist(String),
47
48    #[error("Unexpected key type for map: received {0}, expected String")]
49    UnexpectedKeyTypeForMap(String),
50
51    #[error("Unreachable gluesql value type for parquet writer")]
52    UnreachableGlueSqlValueTypeForParquetWriter,
53}