@@ -4,11 +4,11 @@ macro_rules! bail {
4
4
( $msg: literal $( , ) ?) => {
5
5
return $crate:: private:: Err ( $crate:: format_err!( $msg) ) ;
6
6
} ;
7
- ( $err : expr $( , ) ?) => {
8
- return $crate:: private:: Err ( $crate:: format_err!( $err ) ) ;
7
+ ( $msg : expr $( , ) ?) => {
8
+ return $crate:: private:: Err ( $crate:: format_err!( $msg ) ) ;
9
9
} ;
10
- ( $fmt : expr, $( $arg: tt) * ) => {
11
- return $crate:: private:: Err ( $crate:: format_err!( $fmt , $( $arg) * ) ) ;
10
+ ( $msg : expr, $( $arg: tt) * ) => {
11
+ return $crate:: private:: Err ( $crate:: format_err!( $msg , $( $arg) * ) ) ;
12
12
} ;
13
13
}
14
14
@@ -26,14 +26,14 @@ macro_rules! ensure {
26
26
return $crate:: private:: Err ( $crate:: format_err!( $msg) ) ;
27
27
}
28
28
} ;
29
- ( $cond: expr, $err : expr $( , ) ?) => {
29
+ ( $cond: expr, $msg : expr $( , ) ?) => {
30
30
if !$cond {
31
- return $crate:: private:: Err ( $crate:: format_err!( $err ) ) ;
31
+ return $crate:: private:: Err ( $crate:: format_err!( $msg ) ) ;
32
32
}
33
33
} ;
34
- ( $cond: expr, $fmt : expr, $( $arg: tt) * ) => {
34
+ ( $cond: expr, $msg : expr, $( $arg: tt) * ) => {
35
35
if !$cond {
36
- return $crate:: private:: Err ( $crate:: format_err!( $fmt , $( $arg) * ) ) ;
36
+ return $crate:: private:: Err ( $crate:: format_err!( $msg , $( $arg) * ) ) ;
37
37
}
38
38
} ;
39
39
}
@@ -52,14 +52,14 @@ macro_rules! ensure_eq {
52
52
return $crate:: private:: Err ( $crate:: format_err!( $msg) ) ;
53
53
}
54
54
} ;
55
- ( $left: expr, $right: expr, $err : expr $( , ) ?) => {
55
+ ( $left: expr, $right: expr, $msg : expr $( , ) ?) => {
56
56
if $left != $right {
57
- return $crate:: private:: Err ( $crate:: format_err!( $err ) ) ;
57
+ return $crate:: private:: Err ( $crate:: format_err!( $msg ) ) ;
58
58
}
59
59
} ;
60
- ( $left: expr, $right: expr, $fmt : expr, $( $arg: tt) * ) => {
60
+ ( $left: expr, $right: expr, $msg : expr, $( $arg: tt) * ) => {
61
61
if $left != $right {
62
- return $crate:: private:: Err ( $crate:: format_err!( $fmt , $( $arg) * ) ) ;
62
+ return $crate:: private:: Err ( $crate:: format_err!( $msg , $( $arg) * ) ) ;
63
63
}
64
64
} ;
65
65
}
@@ -84,3 +84,99 @@ macro_rules! format_err {
84
84
$crate:: private:: new_adhoc( format!( $fmt, $( $arg) * ) )
85
85
} ;
86
86
}
87
+
88
+ /// Return early with an error and a status code.
89
+ #[ doc( hidden) ]
90
+ #[ macro_export]
91
+ macro_rules! bail2 {
92
+ ( $status: literal, $msg: literal $( , ) ?) => { {
93
+ return $crate:: private:: Err ( $crate:: format_err2!( $status, $msg) ) ;
94
+ } } ;
95
+ ( $status: literal, $msg: expr $( , ) ?) => {
96
+ return $crate:: private:: Err ( $crate:: format_err2!( $status, $msg) ) ;
97
+ } ;
98
+ ( $status: literal, $msg: expr, $( $arg: tt) * ) => {
99
+ return $crate:: private:: Err ( $crate:: format_err2!( $status, $msg, $( $arg) * ) ) ;
100
+ } ;
101
+ }
102
+
103
+ /// Return early with an error if a condition is not satisfied.
104
+ ///
105
+ /// This macro is equivalent to `if !$cond { return Err(From::from($err)); }`.
106
+ ///
107
+ /// Analogously to `assert!`, `ensure!` takes a condition and exits the function
108
+ /// if the condition fails. Unlike `assert!`, `ensure!` returns an `Error`
109
+ /// rather than panicking.
110
+ #[ doc( hidden) ]
111
+ #[ macro_export]
112
+ macro_rules! ensure2 {
113
+ ( $cond: expr, $status: literal, $msg: literal $( , ) ?) => {
114
+ if !$cond {
115
+ return $crate:: private:: Err ( $crate:: format_err2!( $status, $msg) ) ;
116
+ }
117
+ } ;
118
+ ( $cond: expr, $status: literal, $msg: expr $( , ) ?) => {
119
+ if !$cond {
120
+ return $crate:: private:: Err ( $crate:: format_err2!( $status, $msg) ) ;
121
+ }
122
+ } ;
123
+ ( $cond: expr, $status: literal, $msg: expr, $( $arg: tt) * ) => {
124
+ if !$cond {
125
+ return $crate:: private:: Err ( $crate:: format_err2!( $status, $fmt, $( $arg) * ) ) ;
126
+ }
127
+ } ;
128
+ }
129
+
130
+ /// Return early with an error if two expressions are not equal to each other.
131
+ ///
132
+ /// This macro is equivalent to `if $left != $right { return Err(From::from($err)); }`.
133
+ ///
134
+ /// Analogously to `assert_eq!`, `ensure_eq!` takes two expressions and exits the function
135
+ /// if the expressions are not equal. Unlike `assert_eq!`, `ensure_eq!` returns an `Error`
136
+ /// rather than panicking.
137
+ #[ doc( hidden) ]
138
+ #[ macro_export]
139
+ macro_rules! ensure_eq2 {
140
+ ( $left: expr, $right: expr, $status: literal, $msg: literal $( , ) ?) => {
141
+ if $left != $right {
142
+ return $crate:: private:: Err ( $crate:: format_err2!( $status, $msg) ) ;
143
+ }
144
+ } ;
145
+ ( $left: expr, $right: expr, $status: literal, $msg: expr $( , ) ?) => {
146
+ if $left != $right {
147
+ return $crate:: private:: Err ( $crate:: format_err2!( $status, $msg) ) ;
148
+ }
149
+ } ;
150
+ ( $left: expr, $right: expr, $status: literal, $msg: expr, $( $arg: tt) * ) => {
151
+ if $left != $right {
152
+ return $crate:: private:: Err ( $crate:: format_err2!( $status, $msg, $( $arg) * ) ) ;
153
+ }
154
+ } ;
155
+ }
156
+
157
+ /// Construct an ad-hoc error from a string.
158
+ ///
159
+ /// This evaluates to an `Error`. It can take either just a string, or a format
160
+ /// string with arguments. It also can take any custom type which implements
161
+ /// `Debug` and `Display`.
162
+ #[ doc( hidden) ]
163
+ #[ macro_export]
164
+ macro_rules! format_err2 {
165
+ ( $status: literal, $msg: literal $( , ) ?) => { {
166
+ // Handle $:literal as a special case to make cargo-expanded code more
167
+ // concise in the common case.
168
+ let mut err = $crate:: private:: new_adhoc( $msg) ;
169
+ err. set_status( $status) ;
170
+ err
171
+ } } ;
172
+ ( $status: literal, $msg: expr $( , ) ?) => { {
173
+ let mut err = $crate:: private:: new_adhoc( $msg) ;
174
+ err. set_status( $status) ;
175
+ err
176
+ } } ;
177
+ ( $status: literal, $msg: expr, $( $arg: tt) * ) => { {
178
+ let mut err = $crate:: private:: new_adhoc( format!( $msg, $( $arg) * ) )
179
+ err. set_status( $status) ;
180
+ err
181
+ } } ;
182
+ }
0 commit comments