use core::fmt;
use std::error::Error;
use std::string::{String, ToString};
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
pub enum DynaErrorKind {
UnhandledError,
ProviderError,
LockAlreadyAcquired,
}
impl DynaErrorKind {
pub fn as_str(&self) -> &str {
match *self {
DynaErrorKind::UnhandledError => "unhandled internal error",
DynaErrorKind::ProviderError => "provider error",
DynaErrorKind::LockAlreadyAcquired => "lock has been acquired by another processor",
}
}
}
impl fmt::Display for DynaErrorKind {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.as_str())
}
}
#[derive(Debug, PartialEq)]
pub struct DynaError {
kind: DynaErrorKind,
description: Option<String>,
}
impl DynaError {
pub fn new(kind: DynaErrorKind, description: Option<&str>) -> Self {
DynaError {
kind: kind,
description: description.map(|desc| desc.to_string()),
}
}
pub fn kind(&self) -> DynaErrorKind {
self.kind
}
}
impl fmt::Display for DynaError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self.description {
Some(ref desc) => write!(f, "{}: {}", self.description(), desc),
None => write!(f, "{}", self.description()),
}
}
}
impl Error for DynaError {
fn description(&self) -> &str {
self.kind.as_str()
}
}
impl From<DynaErrorKind> for DynaError {
fn from(kind: DynaErrorKind) -> DynaError {
DynaError {
kind: kind,
description: None,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_dynaerrorkind_as_str_success() {
assert_eq!(
DynaErrorKind::UnhandledError.as_str(),
"unhandled internal error"
);
assert_eq!(DynaErrorKind::ProviderError.as_str(), "provider error");
assert_eq!(
DynaErrorKind::LockAlreadyAcquired.as_str(),
"lock has been acquired by another processor"
);
}
#[test]
fn test_dynaerror_new_success() {
let err = DynaError::new(DynaErrorKind::ProviderError, None);
assert_eq!(err.kind(), DynaErrorKind::ProviderError);
assert_eq!(err.description, None);
assert_eq!(err.description(), "provider error");
}
#[test]
fn test_from_dynaerrorkind_to_dynaerror_success() {
let err = DynaError::new(DynaErrorKind::UnhandledError, None);
assert_eq!(err, DynaError::from(DynaErrorKind::UnhandledError));
}
}