chain_assertions/
result.rs1pub trait AssertOkExt {
3 fn assert_ok(self) -> Self;
27
28 fn debug_assert_ok(self) -> Self;
45}
46
47pub trait AssertErrExt {
49 fn assert_err(self) -> Self;
74
75 fn debug_assert_err(self) -> Self;
91}
92
93impl<T, E> AssertOkExt for Result<T, E>
94where
95 E: crate::fmt::Debug,
96{
97 #[track_caller]
98 #[inline]
99 fn assert_ok(self) -> Self {
100 if let Err(ref e) = self {
101 panic!("Expected Ok(_), got Err({:?})", e);
102 }
103 self
104 }
105
106 #[track_caller]
107 #[inline]
108 fn debug_assert_ok(self) -> Self {
109 #[cfg(all(debug_assertions, not(feature = "passthrough")))]
110 {
111 if let Err(ref e) = self {
112 panic!("Expected Ok(_), got Err({:?})", e);
113 }
114 }
115 self
116 }
117}
118
119impl<T, E> AssertErrExt for Result<T, E>
120where
121 T: crate::fmt::Debug,
122{
123 #[track_caller]
124 #[inline]
125 fn assert_err(self) -> Self {
126 if let Ok(ref v) = self {
127 panic!("Expected Err(_), got Ok({:?})", v);
128 }
129 self
130 }
131
132 #[track_caller]
133 #[inline]
134 fn debug_assert_err(self) -> Self {
135 #[cfg(all(debug_assertions, not(feature = "passthrough")))]
136 {
137 if let Ok(ref v) = self {
138 panic!("Expected Err(_), got Ok({:?})", v);
139 }
140 }
141 self
142 }
143}
144
145#[cfg(test)]
146mod tests {
147 struct NonDebuggable;
148
149 #[derive(Debug)]
150 struct Debuggable;
151
152 mod assert_ok {
153 use super::{super::*, *};
154
155 #[test]
156 fn it_succeeds_on_ok() {
157 let res: Result<NonDebuggable, Debuggable> = Ok(NonDebuggable);
158 let target = res.assert_ok();
159
160 assert!(
161 matches!(target, Ok(NonDebuggable)),
162 "Expected Ok(NonDebuggable)"
163 );
164 }
165
166 #[test]
167 #[should_panic(expected = "Expected Ok(_), got Err(Debuggable)")]
168 fn it_fails_on_err() {
169 let res: Result<NonDebuggable, Debuggable> = Err(Debuggable);
170 let _ = res.assert_ok();
171 }
173 }
174
175 mod debug_assert_ok {
176 use super::{super::*, *};
177
178 #[test]
179 fn it_succeeds_on_ok() {
180 let res: Result<NonDebuggable, Debuggable> = Ok(NonDebuggable);
181 let target = res.debug_assert_ok();
182
183 assert!(matches!(target, Ok(NonDebuggable)), "Expected Ok(_)");
184 }
185
186 #[test]
187 #[cfg_attr(
188 all(debug_assertions, not(feature = "passthrough")),
189 should_panic = "Expected Ok(_), got Err(Debuggable)"
190 )]
191 fn it_fails_on_err_only_in_debug_mode() {
192 let res: Result<NonDebuggable, Debuggable> = Err(Debuggable);
193 let target = res.debug_assert_ok();
194 assert!(
197 matches!(target, Err(Debuggable)),
198 "Expected Err(Debuggable)"
199 );
200 }
201 }
202
203 mod assert_err {
204 use super::{super::*, *};
205
206 #[test]
207 fn it_succeeds_on_err() {
208 let res: Result<Debuggable, NonDebuggable> = Err(NonDebuggable);
209 let target = res.assert_err();
210 assert!(
211 matches!(target, Err(NonDebuggable)),
212 "Expected Err(NonDebuggable)"
213 );
214 }
215
216 #[test]
217 #[should_panic(expected = "Expected Err(_), got Ok(Debuggable)")]
218 fn it_fails_on_ok() {
219 let res: Result<Debuggable, NonDebuggable> = Ok(Debuggable);
220 let _ = res.assert_err();
221 }
223 }
224
225 mod debug_assert_err {
226 use super::{super::*, *};
227
228 #[test]
229 fn it_succeeds_on_err() {
230 let res: Result<Debuggable, NonDebuggable> = Err(NonDebuggable);
231 let target = res.debug_assert_err();
232 assert!(
233 matches!(target, Err(NonDebuggable)),
234 "Expected Err(NonDebuggable)"
235 );
236 }
237
238 #[test]
239 #[cfg_attr(
240 all(debug_assertions, not(feature = "passthrough")),
241 should_panic = "Expected Err(_), got Ok(Debuggable)"
242 )]
243 fn it_fails_on_ok_only_in_debug_mode() {
244 let res: Result<Debuggable, NonDebuggable> = Ok(Debuggable);
245 let target = res.debug_assert_err();
246 assert!(matches!(target, Ok(Debuggable)), "Expected Ok(Debuggable)");
248 }
249 }
250}