redish 0.5.1

A lightweight in-memory key-value database
Documentation
use thiserror::Error;

pub type TreeResult<T> = Result<T, TreeError>;

#[derive(Error, Debug)]
pub enum TreeError {
    #[error("IO error: {0}")]
    Io(#[from] std::io::Error),

    #[error("IO error: {message}")]
    IoExtended { message: String },

    #[error("Serialization error: {message}")]
    Serialization { message: String },

    #[error("Compression error: {message}")]
    Compression { message: String },

    #[error("WAL error: {message}")]
    Wal { message: String },

    #[error("Data corruption detected: {message}")]
    Corruption { message: String },

    #[error("Invalid key: {message}")]
    InvalidKey { message: String },

    #[error("Invalid value: {message}")]
    InvalidValue { message: String },

    #[error("Configuration error: {message}")]
    Configuration { message: String },

    #[error("Cache error: {message}")]
    Cache { message: String },

    #[error("Bloom filter error: {message}")]
    BloomFilter { message: String },

    #[error("Internal error: {message}")]
    Internal { message: String },
    
    #[error("Transaction error: {message}")]   
    Transaction { message: String },

    #[error("SystemTime error: {message}")]
    SystemTimeError { message: String },
}

impl TreeError {
    pub fn io<T: std::fmt::Display>(message: T) -> Self {
        Self::IoExtended {
            message: message.to_string(),
        }
    }

    pub fn serialization<T: std::fmt::Display>(message: T) -> Self {
        Self::Serialization {
            message: message.to_string(),
        }
    }

    pub fn compression<T: std::fmt::Display>(message: T) -> Self {
        Self::Compression {
            message: message.to_string(),
        }
    }

    pub fn wal<T: std::fmt::Display>(message: T) -> Self {
        Self::Wal {
            message: message.to_string(),
        }
    }

    pub fn corruption<T: std::fmt::Display>(message: T) -> Self {
        Self::Corruption {
            message: message.to_string(),
        }
    }

    pub fn invalid_key<T: std::fmt::Display>(message: T) -> Self {
        Self::InvalidKey {
            message: message.to_string(),
        }
    }

    pub fn invalid_value<T: std::fmt::Display>(message: T) -> Self {
        Self::InvalidValue {
            message: message.to_string(),
        }
    }

    pub fn configuration<T: std::fmt::Display>(message: T) -> Self {
        Self::Configuration {
            message: message.to_string(),
        }
    }

    pub fn cache<T: std::fmt::Display>(message: T) -> Self {
        Self::Cache {
            message: message.to_string(),
        }
    }

    pub fn bloom_filter<T: std::fmt::Display>(message: T) -> Self {
        Self::BloomFilter {
            message: message.to_string(),
        }
    }

    pub fn internal<T: std::fmt::Display>(message: T) -> Self {
        Self::Internal {
            message: message.to_string(),
        }
    }

    pub fn transaction<T: std::fmt::Display>(message: T) -> Self {
        Self::Transaction {
            message: message.to_string(),
        }
    }

    pub fn system_time_error<T: std::fmt::Display>(message: T) -> Self {
        Self::SystemTimeError {
            message: message.to_string(),
        }
    }
}

impl From<bincode::error::EncodeError> for TreeError {
    fn from(err: bincode::error::EncodeError) -> Self {
        TreeError::serialization(format!("Encode error: {}", err))
    }
}

impl From<bincode::error::DecodeError> for TreeError {
    fn from(err: bincode::error::DecodeError) -> Self {
        TreeError::serialization(format!("Decode error: {}", err))
    }
}

impl From<Box<dyn std::error::Error>> for TreeError {
    fn from(err: Box<dyn std::error::Error>) -> Self {
        TreeError::internal(format!("Boxed error: {}", err))
    }
}

impl From<std::time::SystemTimeError> for TreeError {
    fn from(err: std::time::SystemTimeError) -> Self {
        TreeError::system_time_error(format!("SystemTimeError: {}", err))   
    }
}