1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
/* .. + lib.rs + .. Copyright 2021 Hwakyeom Kim(=just-do-halee) */ //! First, You should make your own an error set. //! # Example //! ```no_run //! err! { //! BrokenHeader => "broken header." //! AnotherHeader => "not matched header." //! FileNotFound => "file not found." //! EmptyArgument => "empty argument." //! UnexpectedEof => "unexpected eof." //! OutOfBounds => "index out of bounds." //! NotMatched => "btw not matched." //! } //! ``` //! And just errbang! //! ```no_run //! errbang!(err::BrokenHeader); //! ``` //! # More Examples //! ```no_run //! fn foo() -> Result<bool> { // Our Master Result Type //! let bar = 2; //! match bar { //! 0 => Ok(true), //! 1 => Ok(false), //! _ => errbang!(err::NotMatched, "{} is {}", "bar", bar), //! } //! } //! fn main() -> Result<()> { //! let _is_bar_zero = foo()?; //! Ok(()) //! } //! ``` //! ```no_run //! errbang!(err::MyError1); //! errbang!(err::MyError2, "cannot find."); //! errbang!(err::MyError3, "{} is {}", "bar", 2); //! ``` //! //! # ***errcast*** //! Any type of error can be converted into our Master Error. **(non panic unwraping)** //! //! //! ```no_run //! // example //! // <Unwraped Ok> = errcast!(<Any Result>, <Master Err>, <Optional,..>); //! let num_read = errcast!(file.read(&mut buf), err::ReadErr, "this is {} data.", "meta"); //! ``` //! --- //! //! Also casted error has more information. //! //! ```no_run //! // example //! let file = errcast!(fs::File::open("test"), err::MyError, "also io error"); //! ``` //! ``` //! Error: MyError { meta: "[src/main.rs:8] casted error [ fs::File::open(\"test\") ==> Os { code: 2, kind: NotFound, message: \"No such file or directory\" } ] *also io error", message: "this is my error." } //! ``` //! //! --- //! //! # Simply just do this! //! //! ```no_run //! let file = errcast!(File::open("test"), err::FileOpenError) //! ``` //! ## or... //! ```no_run //! // master `Result` can take any errors //! let file = File::open("test")?; //! ``` //! But, *errcast* -> ***errextract*** combo is really good choice. //! //! ```no_run //! fn exe(path: &str) -> Result<usize> { //! let file = errcast!(File::open("test"), err::FileOpenError); //! // ..... //! // ... //! Ok(num) //! } //! //! fn main() -> Result<()> { //! /// non panic unwraping //! /// and specific error can return //! /// matching block //! let num = errextract!(exe(path), //! err::FileOpenError => 0); //! /// other errors will go out -> Result<T> //! //! Ok(()) //! } //! ``` //! --- //! //! #### ***More idiomatic way to handle*** `io::Error` //! ```no_run //! io_err! { //! // io::ErrorKind => err::MyError //! UnexpectedEof => err::MyError1 //! Interrupted => err::MyError2 //! NotFound => err::MyError3 //! // ... //! } //! ``` //! Declare matching macro and just handle that!<br> //! ```no_run //! io_to_err!(file.seek(SeekFrom::End(0)))?; //! //! err_to_io!(my_seek(0))?; //! ``` //! # ***Master Result*** //! * Please use our Master ***Result***\<T\> and ***ResultSend***\<T\> //! instead std::result::Result or io::Result etc.. //! --- //! ###### ***utils-results/lib.rs*** Definition //! ```no_run //! /// Master Result //! pub type Result<T> = result::Result<T, Box<dyn error::Error>>; //! //! /// Master Result for Send + Sync trait //! pub type ResultSend<T> = result::Result<T, Box<dyn error::Error + Send + Sync>>; //! ``` //! --- //! ### just put this in your project. //! ```no_run //! pub use utils_results::*; //! ``` //! ## You can also convert any type of `Result` //! ```rust //! // to our Master Result //! resultcast!(handle.join().unwrap())?; //! // also can convert master Result to ResultSend //! resultcastsend!(some_master_result())?; //! ``` use std::{error, result}; /// Master Result pub type Result<T> = result::Result<T, Box<dyn error::Error>>; /// Master Result for Send + Sync trait pub type ResultSend<T> = result::Result<T, Box<dyn error::Error + Send + Sync>>; #[macro_use] mod macros;