eventuary-core 0.1.0

Core event model and async IO traits for eventuary
Documentation
use thiserror::Error;

#[derive(Error, Debug, Clone)]
pub enum Error {
    #[error("invalid topic: {0}")]
    InvalidTopic(String),

    #[error("invalid namespace: {0}")]
    InvalidNamespace(String),

    #[error("invalid organization: {0}")]
    InvalidOrganization(String),

    #[error("invalid metadata key: {0}")]
    InvalidMetadataKey(String),

    #[error("invalid payload: {0}")]
    InvalidPayload(String),

    #[error("invalid event key: {0}")]
    InvalidEventKey(String),

    #[error("invalid consumer group id: {0}")]
    InvalidConsumerGroupId(String),

    #[error("invalid owner id: {0}")]
    InvalidOwnerId(String),

    #[error("ownership lost: {0}")]
    OwnershipLost(String),

    #[error("invalid start position: {0}")]
    InvalidStartFrom(String),

    #[error("invalid cursor: {0}")]
    InvalidCursor(String),

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

    #[error("store error: {0}")]
    Store(String),

    #[error("handler error: {0}")]
    Handler(String),

    #[error("timeout: {0}")]
    Timeout(String),

    #[error("config error: {0}")]
    Config(String),
}

pub type Result<T> = std::result::Result<T, Error>;

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn config_variant_is_constructible() {
        let err = Error::Config("missing url".to_owned());
        assert!(matches!(err, Error::Config(_)));
        assert_eq!(err.to_string(), "config error: missing url");
    }

    #[test]
    fn invalid_cursor_variant_is_constructible() {
        let err = Error::InvalidCursor("partition count changed".to_owned());
        assert!(matches!(err, Error::InvalidCursor(_)));
        assert_eq!(err.to_string(), "invalid cursor: partition count changed");
    }

    #[test]
    fn error_is_cloneable() {
        let err = Error::Store("write failed".to_owned());
        let cloned = err.clone();

        assert_eq!(err.to_string(), cloned.to_string());
    }
}