omnitrack 0.3.0

Universal issue-tracker provider contracts and clients (Linear, Jira, ...) for Rust, in one crate.
Documentation
use std::fmt;

#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum ErrorKind {
    TransportNotConfigured,
    Transport,
    Decode,
    NotFound,
    Unauthorized,
    RateLimited,
    Provider,
}

#[derive(Clone, Debug, Eq, PartialEq)]
pub struct IssueError {
    kind: ErrorKind,
    message: String,
}

impl IssueError {
    pub fn kind(&self) -> ErrorKind {
        self.kind
    }

    pub fn message(&self) -> &str {
        &self.message
    }
}

impl fmt::Display for IssueError {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "{:?}: {}", self.kind, self.message)
    }
}

impl std::error::Error for IssueError {}

pub type IssueResult<T> = Result<T, IssueError>;

#[derive(Clone, Debug, Default)]
pub struct ErrorBuilder;

impl ErrorBuilder {
    pub fn of(self, kind: ErrorKind, message: impl Into<String>) -> IssueError {
        IssueError {
            kind,
            message: message.into(),
        }
    }

    pub fn transport_not_configured(self) -> IssueError {
        self.of(
            ErrorKind::TransportNotConfigured,
            "transport not configured for this capability",
        )
    }
}

pub fn error() -> ErrorBuilder {
    ErrorBuilder
}