3 releases
0.1.2 | Mar 14, 2022 |
---|---|
0.1.1 | Jan 1, 2022 |
0.1.0 | Dec 31, 2021 |
#2300 in Rust patterns
264 downloads per month
Used in git-wire
11KB
117 lines
cause
[Cause] is a tiny generic implementation of the std::error::Error trait.
It takes 1 type parameter(T: Debug
) who describes what error type happened.
It is dereferencable as &T
.
And if you use macro [cause], it automatically stores some extra information,
the filename and line number, only when it was compiled with debug_assertions
.
Examples
#[derive(Debug, PartialEq, Eq)]
pub enum ErrorType {
InvalidArgumentsError,
InternalError,
NotFoundError,
}
use ErrorType::*;
use cause::Cause;
use std::error::Error;
// It creates an instance of `Cause<ErrorType>`
let cause = Cause::new(InternalError);
assert_eq!(cause.to_string(), "InternalError".to_string());
assert!(cause.message().is_none());
assert!(cause.source().is_none());
// It is dereferencable.
assert_eq!(*cause, InternalError);
let http_status_code = match *cause {
InternalError => 500,
InvalidArgumentsError => 400,
NotFoundError => 404,
};
assert_eq!(http_status_code, 500);
// set the message:
let cause = Cause::new(InvalidArgumentsError).msg("oops!");
assert_eq!(cause.to_string(), "InvalidArgumentsError: oops!".to_string());
assert_eq!(cause.message(), Some(&"oops!".to_string()));
assert!(cause.source().is_none());
// set the source of this error (any error type can be set with `src()`):
let cause = Cause::new(InternalError).src(Cause::new(NotFoundError));
assert_eq!(
cause.to_string(),
"InternalError\n\nCaused by:\n NotFoundError\n".to_string()
);
assert!(cause.message().is_none());
assert!(cause.source().is_some());
// an example of Cause who have a standard io error.
use std::io::Error as IoErr;
use std::io::ErrorKind;
let io_err = IoErr::new(ErrorKind::Other, "oh no!");
println!("{}", Cause::new(InternalError).src(io_err).msg("internal error caused by io error"));
// a couple of macro examples
use cause::cause;
let cause = cause!(InternalError);
println!("{}", cause);
// => "InternalError" on release build
// => "InternalError: [lib.rs:64]" on debug build
let cause = cause!(NotFoundError, "There is no such contents.");
println!("{}", cause);
// => "InternalError: There is no such contents." on release build
// => "InternalError: There is no such contents. [lib.rs:69]" on debug build
Changelog
0.1.2
- Fixed
cause
macro issue thatuse cause::Cause
was implicitly required,
0.1.1
Following getter methods are added to [Cuase].
Cause::message()
Cuase::cause()
0.1.0
Initial Version
License
The MIT License (MIT)
Copyright (c) 2021 msr1k