persistent_keystore_rs/
errors.rs

1
2use std::fmt;
3use crate::structs::Database;
4use std::sync::PoisonError;
5
6#[derive(Debug)]
7pub enum DatabaseError {
8    TableExists(String),
9    TableDoesNotExist(String),
10    TableMissingPrimaryKey,
11    TableNameNotSet,
12    TableMustContainFields,
13    EntryMustContainFields,
14    EntryExists,
15    EntryDoesNotExists,
16    DatabaseIoError(std::io::Error),
17    DatabaseExistsError,
18    DatabaseDoesNotExist(String),
19    UnsupportedField(String),
20    MissingRequiredField(String),
21    MismatchedFieldType,
22    UnsupportedFieldType,
23    DatabaseSerializationError(Box<bincode::ErrorKind>),
24    UnableToGetLock,
25    InvalidPrimaryKey,
26    DatabaseDecompressionError(lz4_flex::block::DecompressError),
27    DatabaseCompressionError(lz4_flex::block::CompressError),
28}
29
30impl fmt::Display for DatabaseError {
31    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
32        let msg = match self {
33            DatabaseError::TableMustContainFields => format!("Table must contain at least one field"),
34            DatabaseError::TableNameNotSet => format!("Table name must not be empty"),
35            DatabaseError::TableMissingPrimaryKey => format!("Missing primary key from table"),
36            DatabaseError::TableExists(t) => format!("Table {} already exists", t),
37            DatabaseError::TableDoesNotExist(t) => format!("Table {} does not exist", t),
38            DatabaseError::EntryExists => format!("Entry exists"),
39            DatabaseError::EntryDoesNotExists => format!("Entry does not exist"),
40            DatabaseError::DatabaseExistsError => format!("Database already exists"),
41            DatabaseError::DatabaseIoError(e) => format!("Database IO Error: {}", e),
42            DatabaseError::DatabaseDoesNotExist(d) => format!("Database {} is not found", d),
43            DatabaseError::UnsupportedField(f) => format!("Field name {} is not supported on table", f),
44            DatabaseError::MissingRequiredField(f) => format!("Missing required field {}", f),
45            DatabaseError::MismatchedFieldType => format!("Field is not a supported type"),
46            DatabaseError::UnsupportedFieldType => format!("Field is not a supported type"),
47            DatabaseError::DatabaseSerializationError(e) => format!("Received Database Serialization error: {}", e),
48            DatabaseError::UnableToGetLock => format!("Unable to acquire lock on database"),
49            DatabaseError::InvalidPrimaryKey => format!("Invalid primary key"),
50            DatabaseError::EntryMustContainFields => format!("Entry must contain at least one field"),
51            DatabaseError::DatabaseCompressionError(e) => format!("Database compression error {}", e),
52            DatabaseError::DatabaseDecompressionError(e) => format!("Database decompression error {}", e),
53        };
54        write!(f, "{}", msg)
55    }
56}
57
58impl From<std::io::Error> for DatabaseError {
59    fn from(e: std::io::Error) -> DatabaseError {
60        DatabaseError::DatabaseIoError(e)
61    }
62}
63
64impl From<Box<bincode::ErrorKind>> for DatabaseError {
65    fn from(e: Box<bincode::ErrorKind>) -> DatabaseError {
66        DatabaseError::DatabaseSerializationError(e)
67    }
68}
69
70impl From<PoisonError<Database>> for DatabaseError {
71    fn from(_: PoisonError<Database>) -> DatabaseError {
72        DatabaseError::UnableToGetLock
73    }
74}
75
76impl From<PoisonError<&mut Database>> for DatabaseError {
77    fn from(_: PoisonError<&mut Database>) -> DatabaseError {
78        DatabaseError::UnableToGetLock
79    }
80}
81
82impl From<lz4_flex::block::DecompressError> for DatabaseError {
83    fn from(e: lz4_flex::block::DecompressError) -> DatabaseError {
84        DatabaseError::DatabaseDecompressionError(e)
85    }
86}
87
88impl From<lz4_flex::block::CompressError> for DatabaseError {
89    fn from(e: lz4_flex::block::CompressError) -> DatabaseError {
90        DatabaseError::DatabaseCompressionError(e)
91    }
92}