rsult 1.4.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +7 -6
- package/readme.md +161 -5
- package/rust/option.rs +2822 -0
- package/rust/result.rs +2207 -0
- package/src/lib.ts +3 -1
- package/src/option-async.test.ts +410 -0
- package/src/option-async.ts +467 -0
- package/src/option.test.ts +101 -0
- package/src/option.ts +480 -266
- package/src/result-async.test.ts +485 -0
- package/src/result-async.ts +635 -0
- package/src/result.test.ts +36 -0
- package/src/result.ts +418 -340
- package/src/types.test.ts +409 -0
- package/dist/lib.d.ts +0 -2
- package/dist/lib.js +0 -19
- package/dist/lib.js.map +0 -1
- package/dist/option.d.ts +0 -307
- package/dist/option.js +0 -195
- package/dist/option.js.map +0 -1
- package/dist/result.d.ts +0 -410
- package/dist/result.js +0 -231
- package/dist/result.js.map +0 -1
package/rust/result.rs
ADDED
|
@@ -0,0 +1,2207 @@
|
|
|
1
|
+
//! Error handling with the `Result` type.
|
|
2
|
+
//!
|
|
3
|
+
//! [`Result<T, E>`][`Result`] is the type used for returning and propagating
|
|
4
|
+
//! errors. It is an enum with the variants, [`Ok(T)`], representing
|
|
5
|
+
//! success and containing a value, and [`Err(E)`], representing error
|
|
6
|
+
//! and containing an error value.
|
|
7
|
+
//!
|
|
8
|
+
//! ```
|
|
9
|
+
//! # #[allow(dead_code)]
|
|
10
|
+
//! enum Result<T, E> {
|
|
11
|
+
//! Ok(T),
|
|
12
|
+
//! Err(E),
|
|
13
|
+
//! }
|
|
14
|
+
//! ```
|
|
15
|
+
//!
|
|
16
|
+
//! Functions return [`Result`] whenever errors are expected and
|
|
17
|
+
//! recoverable. In the `std` crate, [`Result`] is most prominently used
|
|
18
|
+
//! for [I/O](../../std/io/index.html).
|
|
19
|
+
//!
|
|
20
|
+
//! A simple function returning [`Result`] might be
|
|
21
|
+
//! defined and used like so:
|
|
22
|
+
//!
|
|
23
|
+
//! ```
|
|
24
|
+
//! #[derive(Debug)]
|
|
25
|
+
//! enum Version { Version1, Version2 }
|
|
26
|
+
//!
|
|
27
|
+
//! fn parse_version(header: &[u8]) -> Result<Version, &'static str> {
|
|
28
|
+
//! match header.get(0) {
|
|
29
|
+
//! None => Err("invalid header length"),
|
|
30
|
+
//! Some(&1) => Ok(Version::Version1),
|
|
31
|
+
//! Some(&2) => Ok(Version::Version2),
|
|
32
|
+
//! Some(_) => Err("invalid version"),
|
|
33
|
+
//! }
|
|
34
|
+
//! }
|
|
35
|
+
//!
|
|
36
|
+
//! let version = parse_version(&[1, 2, 3, 4]);
|
|
37
|
+
//! match version {
|
|
38
|
+
//! Ok(v) => println!("working with version: {v:?}"),
|
|
39
|
+
//! Err(e) => println!("error parsing header: {e:?}"),
|
|
40
|
+
//! }
|
|
41
|
+
//! ```
|
|
42
|
+
//!
|
|
43
|
+
//! Pattern matching on [`Result`]s is clear and straightforward for
|
|
44
|
+
//! simple cases, but [`Result`] comes with some convenience methods
|
|
45
|
+
//! that make working with it more succinct.
|
|
46
|
+
//!
|
|
47
|
+
//! ```
|
|
48
|
+
//! // The `is_ok` and `is_err` methods do what they say.
|
|
49
|
+
//! let good_result: Result<i32, i32> = Ok(10);
|
|
50
|
+
//! let bad_result: Result<i32, i32> = Err(10);
|
|
51
|
+
//! assert!(good_result.is_ok() && !good_result.is_err());
|
|
52
|
+
//! assert!(bad_result.is_err() && !bad_result.is_ok());
|
|
53
|
+
//!
|
|
54
|
+
//! // `map` and `map_err` consume the `Result` and produce another.
|
|
55
|
+
//! let good_result: Result<i32, i32> = good_result.map(|i| i + 1);
|
|
56
|
+
//! let bad_result: Result<i32, i32> = bad_result.map_err(|i| i - 1);
|
|
57
|
+
//! assert_eq!(good_result, Ok(11));
|
|
58
|
+
//! assert_eq!(bad_result, Err(9));
|
|
59
|
+
//!
|
|
60
|
+
//! // Use `and_then` to continue the computation.
|
|
61
|
+
//! let good_result: Result<bool, i32> = good_result.and_then(|i| Ok(i == 11));
|
|
62
|
+
//! assert_eq!(good_result, Ok(true));
|
|
63
|
+
//!
|
|
64
|
+
//! // Use `or_else` to handle the error.
|
|
65
|
+
//! let bad_result: Result<i32, i32> = bad_result.or_else(|i| Ok(i + 20));
|
|
66
|
+
//! assert_eq!(bad_result, Ok(29));
|
|
67
|
+
//!
|
|
68
|
+
//! // Consume the result and return the contents with `unwrap`.
|
|
69
|
+
//! let final_awesome_result = good_result.unwrap();
|
|
70
|
+
//! assert!(final_awesome_result)
|
|
71
|
+
//! ```
|
|
72
|
+
//!
|
|
73
|
+
//! # Results must be used
|
|
74
|
+
//!
|
|
75
|
+
//! A common problem with using return values to indicate errors is
|
|
76
|
+
//! that it is easy to ignore the return value, thus failing to handle
|
|
77
|
+
//! the error. [`Result`] is annotated with the `#[must_use]` attribute,
|
|
78
|
+
//! which will cause the compiler to issue a warning when a Result
|
|
79
|
+
//! value is ignored. This makes [`Result`] especially useful with
|
|
80
|
+
//! functions that may encounter errors but don't otherwise return a
|
|
81
|
+
//! useful value.
|
|
82
|
+
//!
|
|
83
|
+
//! Consider the [`write_all`] method defined for I/O types
|
|
84
|
+
//! by the [`Write`] trait:
|
|
85
|
+
//!
|
|
86
|
+
//! ```
|
|
87
|
+
//! use std::io;
|
|
88
|
+
//!
|
|
89
|
+
//! trait Write {
|
|
90
|
+
//! fn write_all(&mut self, bytes: &[u8]) -> Result<(), io::Error>;
|
|
91
|
+
//! }
|
|
92
|
+
//! ```
|
|
93
|
+
//!
|
|
94
|
+
//! *Note: The actual definition of [`Write`] uses [`io::Result`], which
|
|
95
|
+
//! is just a synonym for <code>[Result]<T, [io::Error]></code>.*
|
|
96
|
+
//!
|
|
97
|
+
//! This method doesn't produce a value, but the write may
|
|
98
|
+
//! fail. It's crucial to handle the error case, and *not* write
|
|
99
|
+
//! something like this:
|
|
100
|
+
//!
|
|
101
|
+
//! ```no_run
|
|
102
|
+
//! # #![allow(unused_must_use)] // \o/
|
|
103
|
+
//! use std::fs::File;
|
|
104
|
+
//! use std::io::prelude::*;
|
|
105
|
+
//!
|
|
106
|
+
//! let mut file = File::create("valuable_data.txt").unwrap();
|
|
107
|
+
//! // If `write_all` errors, then we'll never know, because the return
|
|
108
|
+
//! // value is ignored.
|
|
109
|
+
//! file.write_all(b"important message");
|
|
110
|
+
//! ```
|
|
111
|
+
//!
|
|
112
|
+
//! If you *do* write that in Rust, the compiler will give you a
|
|
113
|
+
//! warning (by default, controlled by the `unused_must_use` lint).
|
|
114
|
+
//!
|
|
115
|
+
//! You might instead, if you don't want to handle the error, simply
|
|
116
|
+
//! assert success with [`expect`]. This will panic if the
|
|
117
|
+
//! write fails, providing a marginally useful message indicating why:
|
|
118
|
+
//!
|
|
119
|
+
//! ```no_run
|
|
120
|
+
//! use std::fs::File;
|
|
121
|
+
//! use std::io::prelude::*;
|
|
122
|
+
//!
|
|
123
|
+
//! let mut file = File::create("valuable_data.txt").unwrap();
|
|
124
|
+
//! file.write_all(b"important message").expect("failed to write message");
|
|
125
|
+
//! ```
|
|
126
|
+
//!
|
|
127
|
+
//! You might also simply assert success:
|
|
128
|
+
//!
|
|
129
|
+
//! ```no_run
|
|
130
|
+
//! # use std::fs::File;
|
|
131
|
+
//! # use std::io::prelude::*;
|
|
132
|
+
//! # let mut file = File::create("valuable_data.txt").unwrap();
|
|
133
|
+
//! assert!(file.write_all(b"important message").is_ok());
|
|
134
|
+
//! ```
|
|
135
|
+
//!
|
|
136
|
+
//! Or propagate the error up the call stack with [`?`]:
|
|
137
|
+
//!
|
|
138
|
+
//! ```
|
|
139
|
+
//! # use std::fs::File;
|
|
140
|
+
//! # use std::io::prelude::*;
|
|
141
|
+
//! # use std::io;
|
|
142
|
+
//! # #[allow(dead_code)]
|
|
143
|
+
//! fn write_message() -> io::Result<()> {
|
|
144
|
+
//! let mut file = File::create("valuable_data.txt")?;
|
|
145
|
+
//! file.write_all(b"important message")?;
|
|
146
|
+
//! Ok(())
|
|
147
|
+
//! }
|
|
148
|
+
//! ```
|
|
149
|
+
//!
|
|
150
|
+
//! # The question mark operator, `?`
|
|
151
|
+
//!
|
|
152
|
+
//! When writing code that calls many functions that return the
|
|
153
|
+
//! [`Result`] type, the error handling can be tedious. The question mark
|
|
154
|
+
//! operator, [`?`], hides some of the boilerplate of propagating errors
|
|
155
|
+
//! up the call stack.
|
|
156
|
+
//!
|
|
157
|
+
//! It replaces this:
|
|
158
|
+
//!
|
|
159
|
+
//! ```
|
|
160
|
+
//! # #![allow(dead_code)]
|
|
161
|
+
//! use std::fs::File;
|
|
162
|
+
//! use std::io::prelude::*;
|
|
163
|
+
//! use std::io;
|
|
164
|
+
//!
|
|
165
|
+
//! struct Info {
|
|
166
|
+
//! name: String,
|
|
167
|
+
//! age: i32,
|
|
168
|
+
//! rating: i32,
|
|
169
|
+
//! }
|
|
170
|
+
//!
|
|
171
|
+
//! fn write_info(info: &Info) -> io::Result<()> {
|
|
172
|
+
//! // Early return on error
|
|
173
|
+
//! let mut file = match File::create("my_best_friends.txt") {
|
|
174
|
+
//! Err(e) => return Err(e),
|
|
175
|
+
//! Ok(f) => f,
|
|
176
|
+
//! };
|
|
177
|
+
//! if let Err(e) = file.write_all(format!("name: {}\n", info.name).as_bytes()) {
|
|
178
|
+
//! return Err(e)
|
|
179
|
+
//! }
|
|
180
|
+
//! if let Err(e) = file.write_all(format!("age: {}\n", info.age).as_bytes()) {
|
|
181
|
+
//! return Err(e)
|
|
182
|
+
//! }
|
|
183
|
+
//! if let Err(e) = file.write_all(format!("rating: {}\n", info.rating).as_bytes()) {
|
|
184
|
+
//! return Err(e)
|
|
185
|
+
//! }
|
|
186
|
+
//! Ok(())
|
|
187
|
+
//! }
|
|
188
|
+
//! ```
|
|
189
|
+
//!
|
|
190
|
+
//! With this:
|
|
191
|
+
//!
|
|
192
|
+
//! ```
|
|
193
|
+
//! # #![allow(dead_code)]
|
|
194
|
+
//! use std::fs::File;
|
|
195
|
+
//! use std::io::prelude::*;
|
|
196
|
+
//! use std::io;
|
|
197
|
+
//!
|
|
198
|
+
//! struct Info {
|
|
199
|
+
//! name: String,
|
|
200
|
+
//! age: i32,
|
|
201
|
+
//! rating: i32,
|
|
202
|
+
//! }
|
|
203
|
+
//!
|
|
204
|
+
//! fn write_info(info: &Info) -> io::Result<()> {
|
|
205
|
+
//! let mut file = File::create("my_best_friends.txt")?;
|
|
206
|
+
//! // Early return on error
|
|
207
|
+
//! file.write_all(format!("name: {}\n", info.name).as_bytes())?;
|
|
208
|
+
//! file.write_all(format!("age: {}\n", info.age).as_bytes())?;
|
|
209
|
+
//! file.write_all(format!("rating: {}\n", info.rating).as_bytes())?;
|
|
210
|
+
//! Ok(())
|
|
211
|
+
//! }
|
|
212
|
+
//! ```
|
|
213
|
+
//!
|
|
214
|
+
//! *It's much nicer!*
|
|
215
|
+
//!
|
|
216
|
+
//! Ending the expression with [`?`] will result in the [`Ok`]'s unwrapped value, unless the result
|
|
217
|
+
//! is [`Err`], in which case [`Err`] is returned early from the enclosing function.
|
|
218
|
+
//!
|
|
219
|
+
//! [`?`] can be used in functions that return [`Result`] because of the
|
|
220
|
+
//! early return of [`Err`] that it provides.
|
|
221
|
+
//!
|
|
222
|
+
//! [`expect`]: Result::expect
|
|
223
|
+
//! [`Write`]: ../../std/io/trait.Write.html "io::Write"
|
|
224
|
+
//! [`write_all`]: ../../std/io/trait.Write.html#method.write_all "io::Write::write_all"
|
|
225
|
+
//! [`io::Result`]: ../../std/io/type.Result.html "io::Result"
|
|
226
|
+
//! [`?`]: crate::ops::Try
|
|
227
|
+
//! [`Ok(T)`]: Ok
|
|
228
|
+
//! [`Err(E)`]: Err
|
|
229
|
+
//! [io::Error]: ../../std/io/struct.Error.html "io::Error"
|
|
230
|
+
//!
|
|
231
|
+
//! # Representation
|
|
232
|
+
//!
|
|
233
|
+
//! In some cases, [`Result<T, E>`] comes with size, alignment, and ABI
|
|
234
|
+
//! guarantees. Specifically, one of either the `T` or `E` type must be a type
|
|
235
|
+
//! that qualifies for the `Option` [representation guarantees][opt-rep] (let's
|
|
236
|
+
//! call that type `I`), and the *other* type is a zero-sized type with
|
|
237
|
+
//! alignment 1 (a "1-ZST").
|
|
238
|
+
//!
|
|
239
|
+
//! If that is the case, then `Result<T, E>` has the same size, alignment, and
|
|
240
|
+
//! [function call ABI] as `I` (and therefore, as `Option<I>`). If `I` is `T`,
|
|
241
|
+
//! it is therefore sound to transmute a value `t` of type `I` to type
|
|
242
|
+
//! `Result<T, E>` (producing the value `Ok(t)`) and to transmute a value
|
|
243
|
+
//! `Ok(t)` of type `Result<T, E>` to type `I` (producing the value `t`). If `I`
|
|
244
|
+
//! is `E`, the same applies with `Ok` replaced by `Err`.
|
|
245
|
+
//!
|
|
246
|
+
//! For example, `NonZeroI32` qualifies for the `Option` representation
|
|
247
|
+
//! guarantees and `()` is a zero-sized type with alignment 1. This means that
|
|
248
|
+
//! both `Result<NonZeroI32, ()>` and `Result<(), NonZeroI32>` have the same
|
|
249
|
+
//! size, alignment, and ABI as `NonZeroI32` (and `Option<NonZeroI32>`). The
|
|
250
|
+
//! only difference between these is in the implied semantics:
|
|
251
|
+
//!
|
|
252
|
+
//! * `Option<NonZeroI32>` is "a non-zero i32 might be present"
|
|
253
|
+
//! * `Result<NonZeroI32, ()>` is "a non-zero i32 success result, if any"
|
|
254
|
+
//! * `Result<(), NonZeroI32>` is "a non-zero i32 error result, if any"
|
|
255
|
+
//!
|
|
256
|
+
//! [opt-rep]: ../option/index.html#representation "Option Representation"
|
|
257
|
+
//! [function call ABI]: ../primitive.fn.html#abi-compatibility
|
|
258
|
+
//!
|
|
259
|
+
//! # Method overview
|
|
260
|
+
//!
|
|
261
|
+
//! In addition to working with pattern matching, [`Result`] provides a
|
|
262
|
+
//! wide variety of different methods.
|
|
263
|
+
//!
|
|
264
|
+
//! ## Querying the variant
|
|
265
|
+
//!
|
|
266
|
+
//! The [`is_ok`] and [`is_err`] methods return [`true`] if the [`Result`]
|
|
267
|
+
//! is [`Ok`] or [`Err`], respectively.
|
|
268
|
+
//!
|
|
269
|
+
//! The [`is_ok_and`] and [`is_err_and`] methods apply the provided function
|
|
270
|
+
//! to the contents of the [`Result`] to produce a boolean value. If the [`Result`] does not have the expected variant
|
|
271
|
+
//! then [`false`] is returned instead without executing the function.
|
|
272
|
+
//!
|
|
273
|
+
//! [`is_err`]: Result::is_err
|
|
274
|
+
//! [`is_ok`]: Result::is_ok
|
|
275
|
+
//! [`is_ok_and`]: Result::is_ok_and
|
|
276
|
+
//! [`is_err_and`]: Result::is_err_and
|
|
277
|
+
//!
|
|
278
|
+
//! ## Adapters for working with references
|
|
279
|
+
//!
|
|
280
|
+
//! * [`as_ref`] converts from `&Result<T, E>` to `Result<&T, &E>`
|
|
281
|
+
//! * [`as_mut`] converts from `&mut Result<T, E>` to `Result<&mut T, &mut E>`
|
|
282
|
+
//! * [`as_deref`] converts from `&Result<T, E>` to `Result<&T::Target, &E>`
|
|
283
|
+
//! * [`as_deref_mut`] converts from `&mut Result<T, E>` to
|
|
284
|
+
//! `Result<&mut T::Target, &mut E>`
|
|
285
|
+
//!
|
|
286
|
+
//! [`as_deref`]: Result::as_deref
|
|
287
|
+
//! [`as_deref_mut`]: Result::as_deref_mut
|
|
288
|
+
//! [`as_mut`]: Result::as_mut
|
|
289
|
+
//! [`as_ref`]: Result::as_ref
|
|
290
|
+
//!
|
|
291
|
+
//! ## Extracting contained values
|
|
292
|
+
//!
|
|
293
|
+
//! These methods extract the contained value in a [`Result<T, E>`] when it
|
|
294
|
+
//! is the [`Ok`] variant. If the [`Result`] is [`Err`]:
|
|
295
|
+
//!
|
|
296
|
+
//! * [`expect`] panics with a provided custom message
|
|
297
|
+
//! * [`unwrap`] panics with a generic message
|
|
298
|
+
//! * [`unwrap_or`] returns the provided default value
|
|
299
|
+
//! * [`unwrap_or_default`] returns the default value of the type `T`
|
|
300
|
+
//! (which must implement the [`Default`] trait)
|
|
301
|
+
//! * [`unwrap_or_else`] returns the result of evaluating the provided
|
|
302
|
+
//! function
|
|
303
|
+
//! * [`unwrap_unchecked`] produces *[undefined behavior]*
|
|
304
|
+
//!
|
|
305
|
+
//! The panicking methods [`expect`] and [`unwrap`] require `E` to
|
|
306
|
+
//! implement the [`Debug`] trait.
|
|
307
|
+
//!
|
|
308
|
+
//! [`Debug`]: crate::fmt::Debug
|
|
309
|
+
//! [`expect`]: Result::expect
|
|
310
|
+
//! [`unwrap`]: Result::unwrap
|
|
311
|
+
//! [`unwrap_or`]: Result::unwrap_or
|
|
312
|
+
//! [`unwrap_or_default`]: Result::unwrap_or_default
|
|
313
|
+
//! [`unwrap_or_else`]: Result::unwrap_or_else
|
|
314
|
+
//! [`unwrap_unchecked`]: Result::unwrap_unchecked
|
|
315
|
+
//! [undefined behavior]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html
|
|
316
|
+
//!
|
|
317
|
+
//! These methods extract the contained value in a [`Result<T, E>`] when it
|
|
318
|
+
//! is the [`Err`] variant. They require `T` to implement the [`Debug`]
|
|
319
|
+
//! trait. If the [`Result`] is [`Ok`]:
|
|
320
|
+
//!
|
|
321
|
+
//! * [`expect_err`] panics with a provided custom message
|
|
322
|
+
//! * [`unwrap_err`] panics with a generic message
|
|
323
|
+
//! * [`unwrap_err_unchecked`] produces *[undefined behavior]*
|
|
324
|
+
//!
|
|
325
|
+
//! [`Debug`]: crate::fmt::Debug
|
|
326
|
+
//! [`expect_err`]: Result::expect_err
|
|
327
|
+
//! [`unwrap_err`]: Result::unwrap_err
|
|
328
|
+
//! [`unwrap_err_unchecked`]: Result::unwrap_err_unchecked
|
|
329
|
+
//! [undefined behavior]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html
|
|
330
|
+
//!
|
|
331
|
+
//! ## Transforming contained values
|
|
332
|
+
//!
|
|
333
|
+
//! These methods transform [`Result`] to [`Option`]:
|
|
334
|
+
//!
|
|
335
|
+
//! * [`err`][Result::err] transforms [`Result<T, E>`] into [`Option<E>`],
|
|
336
|
+
//! mapping [`Err(e)`] to [`Some(e)`] and [`Ok(v)`] to [`None`]
|
|
337
|
+
//! * [`ok`][Result::ok] transforms [`Result<T, E>`] into [`Option<T>`],
|
|
338
|
+
//! mapping [`Ok(v)`] to [`Some(v)`] and [`Err(e)`] to [`None`]
|
|
339
|
+
//! * [`transpose`] transposes a [`Result`] of an [`Option`] into an
|
|
340
|
+
//! [`Option`] of a [`Result`]
|
|
341
|
+
//!
|
|
342
|
+
// Do NOT add link reference definitions for `err` or `ok`, because they
|
|
343
|
+
// will generate numerous incorrect URLs for `Err` and `Ok` elsewhere, due
|
|
344
|
+
// to case folding.
|
|
345
|
+
//!
|
|
346
|
+
//! [`Err(e)`]: Err
|
|
347
|
+
//! [`Ok(v)`]: Ok
|
|
348
|
+
//! [`Some(e)`]: Option::Some
|
|
349
|
+
//! [`Some(v)`]: Option::Some
|
|
350
|
+
//! [`transpose`]: Result::transpose
|
|
351
|
+
//!
|
|
352
|
+
//! These methods transform the contained value of the [`Ok`] variant:
|
|
353
|
+
//!
|
|
354
|
+
//! * [`map`] transforms [`Result<T, E>`] into [`Result<U, E>`] by applying
|
|
355
|
+
//! the provided function to the contained value of [`Ok`] and leaving
|
|
356
|
+
//! [`Err`] values unchanged
|
|
357
|
+
//! * [`inspect`] takes ownership of the [`Result`], applies the
|
|
358
|
+
//! provided function to the contained value by reference,
|
|
359
|
+
//! and then returns the [`Result`]
|
|
360
|
+
//!
|
|
361
|
+
//! [`map`]: Result::map
|
|
362
|
+
//! [`inspect`]: Result::inspect
|
|
363
|
+
//!
|
|
364
|
+
//! These methods transform the contained value of the [`Err`] variant:
|
|
365
|
+
//!
|
|
366
|
+
//! * [`map_err`] transforms [`Result<T, E>`] into [`Result<T, F>`] by
|
|
367
|
+
//! applying the provided function to the contained value of [`Err`] and
|
|
368
|
+
//! leaving [`Ok`] values unchanged
|
|
369
|
+
//! * [`inspect_err`] takes ownership of the [`Result`], applies the
|
|
370
|
+
//! provided function to the contained value of [`Err`] by reference,
|
|
371
|
+
//! and then returns the [`Result`]
|
|
372
|
+
//!
|
|
373
|
+
//! [`map_err`]: Result::map_err
|
|
374
|
+
//! [`inspect_err`]: Result::inspect_err
|
|
375
|
+
//!
|
|
376
|
+
//! These methods transform a [`Result<T, E>`] into a value of a possibly
|
|
377
|
+
//! different type `U`:
|
|
378
|
+
//!
|
|
379
|
+
//! * [`map_or`] applies the provided function to the contained value of
|
|
380
|
+
//! [`Ok`], or returns the provided default value if the [`Result`] is
|
|
381
|
+
//! [`Err`]
|
|
382
|
+
//! * [`map_or_else`] applies the provided function to the contained value
|
|
383
|
+
//! of [`Ok`], or applies the provided default fallback function to the
|
|
384
|
+
//! contained value of [`Err`]
|
|
385
|
+
//!
|
|
386
|
+
//! [`map_or`]: Result::map_or
|
|
387
|
+
//! [`map_or_else`]: Result::map_or_else
|
|
388
|
+
//!
|
|
389
|
+
//! ## Boolean operators
|
|
390
|
+
//!
|
|
391
|
+
//! These methods treat the [`Result`] as a boolean value, where [`Ok`]
|
|
392
|
+
//! acts like [`true`] and [`Err`] acts like [`false`]. There are two
|
|
393
|
+
//! categories of these methods: ones that take a [`Result`] as input, and
|
|
394
|
+
//! ones that take a function as input (to be lazily evaluated).
|
|
395
|
+
//!
|
|
396
|
+
//! The [`and`] and [`or`] methods take another [`Result`] as input, and
|
|
397
|
+
//! produce a [`Result`] as output. The [`and`] method can produce a
|
|
398
|
+
//! [`Result<U, E>`] value having a different inner type `U` than
|
|
399
|
+
//! [`Result<T, E>`]. The [`or`] method can produce a [`Result<T, F>`]
|
|
400
|
+
//! value having a different error type `F` than [`Result<T, E>`].
|
|
401
|
+
//!
|
|
402
|
+
//! | method | self | input | output |
|
|
403
|
+
//! |---------|----------|-----------|----------|
|
|
404
|
+
//! | [`and`] | `Err(e)` | (ignored) | `Err(e)` |
|
|
405
|
+
//! | [`and`] | `Ok(x)` | `Err(d)` | `Err(d)` |
|
|
406
|
+
//! | [`and`] | `Ok(x)` | `Ok(y)` | `Ok(y)` |
|
|
407
|
+
//! | [`or`] | `Err(e)` | `Err(d)` | `Err(d)` |
|
|
408
|
+
//! | [`or`] | `Err(e)` | `Ok(y)` | `Ok(y)` |
|
|
409
|
+
//! | [`or`] | `Ok(x)` | (ignored) | `Ok(x)` |
|
|
410
|
+
//!
|
|
411
|
+
//! [`and`]: Result::and
|
|
412
|
+
//! [`or`]: Result::or
|
|
413
|
+
//!
|
|
414
|
+
//! The [`and_then`] and [`or_else`] methods take a function as input, and
|
|
415
|
+
//! only evaluate the function when they need to produce a new value. The
|
|
416
|
+
//! [`and_then`] method can produce a [`Result<U, E>`] value having a
|
|
417
|
+
//! different inner type `U` than [`Result<T, E>`]. The [`or_else`] method
|
|
418
|
+
//! can produce a [`Result<T, F>`] value having a different error type `F`
|
|
419
|
+
//! than [`Result<T, E>`].
|
|
420
|
+
//!
|
|
421
|
+
//! | method | self | function input | function result | output |
|
|
422
|
+
//! |--------------|----------|----------------|-----------------|----------|
|
|
423
|
+
//! | [`and_then`] | `Err(e)` | (not provided) | (not evaluated) | `Err(e)` |
|
|
424
|
+
//! | [`and_then`] | `Ok(x)` | `x` | `Err(d)` | `Err(d)` |
|
|
425
|
+
//! | [`and_then`] | `Ok(x)` | `x` | `Ok(y)` | `Ok(y)` |
|
|
426
|
+
//! | [`or_else`] | `Err(e)` | `e` | `Err(d)` | `Err(d)` |
|
|
427
|
+
//! | [`or_else`] | `Err(e)` | `e` | `Ok(y)` | `Ok(y)` |
|
|
428
|
+
//! | [`or_else`] | `Ok(x)` | (not provided) | (not evaluated) | `Ok(x)` |
|
|
429
|
+
//!
|
|
430
|
+
//! [`and_then`]: Result::and_then
|
|
431
|
+
//! [`or_else`]: Result::or_else
|
|
432
|
+
//!
|
|
433
|
+
//! ## Comparison operators
|
|
434
|
+
//!
|
|
435
|
+
//! If `T` and `E` both implement [`PartialOrd`] then [`Result<T, E>`] will
|
|
436
|
+
//! derive its [`PartialOrd`] implementation. With this order, an [`Ok`]
|
|
437
|
+
//! compares as less than any [`Err`], while two [`Ok`] or two [`Err`]
|
|
438
|
+
//! compare as their contained values would in `T` or `E` respectively. If `T`
|
|
439
|
+
//! and `E` both also implement [`Ord`], then so does [`Result<T, E>`].
|
|
440
|
+
//!
|
|
441
|
+
//! ```
|
|
442
|
+
//! assert!(Ok(1) < Err(0));
|
|
443
|
+
//! let x: Result<i32, ()> = Ok(0);
|
|
444
|
+
//! let y = Ok(1);
|
|
445
|
+
//! assert!(x < y);
|
|
446
|
+
//! let x: Result<(), i32> = Err(0);
|
|
447
|
+
//! let y = Err(1);
|
|
448
|
+
//! assert!(x < y);
|
|
449
|
+
//! ```
|
|
450
|
+
//!
|
|
451
|
+
//! ## Iterating over `Result`
|
|
452
|
+
//!
|
|
453
|
+
//! A [`Result`] can be iterated over. This can be helpful if you need an
|
|
454
|
+
//! iterator that is conditionally empty. The iterator will either produce
|
|
455
|
+
//! a single value (when the [`Result`] is [`Ok`]), or produce no values
|
|
456
|
+
//! (when the [`Result`] is [`Err`]). For example, [`into_iter`] acts like
|
|
457
|
+
//! [`once(v)`] if the [`Result`] is [`Ok(v)`], and like [`empty()`] if the
|
|
458
|
+
//! [`Result`] is [`Err`].
|
|
459
|
+
//!
|
|
460
|
+
//! [`Ok(v)`]: Ok
|
|
461
|
+
//! [`empty()`]: crate::iter::empty
|
|
462
|
+
//! [`once(v)`]: crate::iter::once
|
|
463
|
+
//!
|
|
464
|
+
//! Iterators over [`Result<T, E>`] come in three types:
|
|
465
|
+
//!
|
|
466
|
+
//! * [`into_iter`] consumes the [`Result`] and produces the contained
|
|
467
|
+
//! value
|
|
468
|
+
//! * [`iter`] produces an immutable reference of type `&T` to the
|
|
469
|
+
//! contained value
|
|
470
|
+
//! * [`iter_mut`] produces a mutable reference of type `&mut T` to the
|
|
471
|
+
//! contained value
|
|
472
|
+
//!
|
|
473
|
+
//! See [Iterating over `Option`] for examples of how this can be useful.
|
|
474
|
+
//!
|
|
475
|
+
//! [Iterating over `Option`]: crate::option#iterating-over-option
|
|
476
|
+
//! [`into_iter`]: Result::into_iter
|
|
477
|
+
//! [`iter`]: Result::iter
|
|
478
|
+
//! [`iter_mut`]: Result::iter_mut
|
|
479
|
+
//!
|
|
480
|
+
//! You might want to use an iterator chain to do multiple instances of an
|
|
481
|
+
//! operation that can fail, but would like to ignore failures while
|
|
482
|
+
//! continuing to process the successful results. In this example, we take
|
|
483
|
+
//! advantage of the iterable nature of [`Result`] to select only the
|
|
484
|
+
//! [`Ok`] values using [`flatten`][Iterator::flatten].
|
|
485
|
+
//!
|
|
486
|
+
//! ```
|
|
487
|
+
//! # use std::str::FromStr;
|
|
488
|
+
//! let mut results = vec![];
|
|
489
|
+
//! let mut errs = vec![];
|
|
490
|
+
//! let nums: Vec<_> = ["17", "not a number", "99", "-27", "768"]
|
|
491
|
+
//! .into_iter()
|
|
492
|
+
//! .map(u8::from_str)
|
|
493
|
+
//! // Save clones of the raw `Result` values to inspect
|
|
494
|
+
//! .inspect(|x| results.push(x.clone()))
|
|
495
|
+
//! // Challenge: explain how this captures only the `Err` values
|
|
496
|
+
//! .inspect(|x| errs.extend(x.clone().err()))
|
|
497
|
+
//! .flatten()
|
|
498
|
+
//! .collect();
|
|
499
|
+
//! assert_eq!(errs.len(), 3);
|
|
500
|
+
//! assert_eq!(nums, [17, 99]);
|
|
501
|
+
//! println!("results {results:?}");
|
|
502
|
+
//! println!("errs {errs:?}");
|
|
503
|
+
//! println!("nums {nums:?}");
|
|
504
|
+
//! ```
|
|
505
|
+
//!
|
|
506
|
+
//! ## Collecting into `Result`
|
|
507
|
+
//!
|
|
508
|
+
//! [`Result`] implements the [`FromIterator`][impl-FromIterator] trait,
|
|
509
|
+
//! which allows an iterator over [`Result`] values to be collected into a
|
|
510
|
+
//! [`Result`] of a collection of each contained value of the original
|
|
511
|
+
//! [`Result`] values, or [`Err`] if any of the elements was [`Err`].
|
|
512
|
+
//!
|
|
513
|
+
//! [impl-FromIterator]: Result#impl-FromIterator%3CResult%3CA,+E%3E%3E-for-Result%3CV,+E%3E
|
|
514
|
+
//!
|
|
515
|
+
//! ```
|
|
516
|
+
//! let v = [Ok(2), Ok(4), Err("err!"), Ok(8)];
|
|
517
|
+
//! let res: Result<Vec<_>, &str> = v.into_iter().collect();
|
|
518
|
+
//! assert_eq!(res, Err("err!"));
|
|
519
|
+
//! let v = [Ok(2), Ok(4), Ok(8)];
|
|
520
|
+
//! let res: Result<Vec<_>, &str> = v.into_iter().collect();
|
|
521
|
+
//! assert_eq!(res, Ok(vec![2, 4, 8]));
|
|
522
|
+
//! ```
|
|
523
|
+
//!
|
|
524
|
+
//! [`Result`] also implements the [`Product`][impl-Product] and
|
|
525
|
+
//! [`Sum`][impl-Sum] traits, allowing an iterator over [`Result`] values
|
|
526
|
+
//! to provide the [`product`][Iterator::product] and
|
|
527
|
+
//! [`sum`][Iterator::sum] methods.
|
|
528
|
+
//!
|
|
529
|
+
//! [impl-Product]: Result#impl-Product%3CResult%3CU,+E%3E%3E-for-Result%3CT,+E%3E
|
|
530
|
+
//! [impl-Sum]: Result#impl-Sum%3CResult%3CU,+E%3E%3E-for-Result%3CT,+E%3E
|
|
531
|
+
//!
|
|
532
|
+
//! ```
|
|
533
|
+
//! let v = [Err("error!"), Ok(1), Ok(2), Ok(3), Err("foo")];
|
|
534
|
+
//! let res: Result<i32, &str> = v.into_iter().sum();
|
|
535
|
+
//! assert_eq!(res, Err("error!"));
|
|
536
|
+
//! let v = [Ok(1), Ok(2), Ok(21)];
|
|
537
|
+
//! let res: Result<i32, &str> = v.into_iter().product();
|
|
538
|
+
//! assert_eq!(res, Ok(42));
|
|
539
|
+
//! ```
|
|
540
|
+
|
|
541
|
+
#![stable(feature = "rust1", since = "1.0.0")]
|
|
542
|
+
|
|
543
|
+
use crate::iter::{self, FusedIterator, TrustedLen};
|
|
544
|
+
use crate::marker::Destruct;
|
|
545
|
+
use crate::ops::{self, ControlFlow, Deref, DerefMut};
|
|
546
|
+
use crate::{convert, fmt, hint};
|
|
547
|
+
|
|
548
|
+
/// `Result` is a type that represents either success ([`Ok`]) or failure ([`Err`]).
|
|
549
|
+
///
|
|
550
|
+
/// See the [module documentation](self) for details.
|
|
551
|
+
#[doc(search_unbox)]
|
|
552
|
+
#[derive(Copy, Debug, Hash)]
|
|
553
|
+
#[derive_const(PartialEq, PartialOrd, Eq, Ord)]
|
|
554
|
+
#[must_use = "this `Result` may be an `Err` variant, which should be handled"]
|
|
555
|
+
#[rustc_diagnostic_item = "Result"]
|
|
556
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
557
|
+
pub enum Result<T, E> {
|
|
558
|
+
/// Contains the success value
|
|
559
|
+
#[lang = "Ok"]
|
|
560
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
561
|
+
Ok(#[stable(feature = "rust1", since = "1.0.0")] T),
|
|
562
|
+
|
|
563
|
+
/// Contains the error value
|
|
564
|
+
#[lang = "Err"]
|
|
565
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
566
|
+
Err(#[stable(feature = "rust1", since = "1.0.0")] E),
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
570
|
+
// Type implementation
|
|
571
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
572
|
+
|
|
573
|
+
impl<T, E> Result<T, E> {
|
|
574
|
+
/////////////////////////////////////////////////////////////////////////
|
|
575
|
+
// Querying the contained values
|
|
576
|
+
/////////////////////////////////////////////////////////////////////////
|
|
577
|
+
|
|
578
|
+
/// Returns `true` if the result is [`Ok`].
|
|
579
|
+
///
|
|
580
|
+
/// # Examples
|
|
581
|
+
///
|
|
582
|
+
/// ```
|
|
583
|
+
/// let x: Result<i32, &str> = Ok(-3);
|
|
584
|
+
/// assert_eq!(x.is_ok(), true);
|
|
585
|
+
///
|
|
586
|
+
/// let x: Result<i32, &str> = Err("Some error message");
|
|
587
|
+
/// assert_eq!(x.is_ok(), false);
|
|
588
|
+
/// ```
|
|
589
|
+
#[must_use = "if you intended to assert that this is ok, consider `.unwrap()` instead"]
|
|
590
|
+
#[rustc_const_stable(feature = "const_result_basics", since = "1.48.0")]
|
|
591
|
+
#[inline]
|
|
592
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
593
|
+
pub const fn is_ok(&self) -> bool {
|
|
594
|
+
matches!(*self, Ok(_))
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
/// Returns `true` if the result is [`Ok`] and the value inside of it matches a predicate.
|
|
598
|
+
///
|
|
599
|
+
/// # Examples
|
|
600
|
+
///
|
|
601
|
+
/// ```
|
|
602
|
+
/// let x: Result<u32, &str> = Ok(2);
|
|
603
|
+
/// assert_eq!(x.is_ok_and(|x| x > 1), true);
|
|
604
|
+
///
|
|
605
|
+
/// let x: Result<u32, &str> = Ok(0);
|
|
606
|
+
/// assert_eq!(x.is_ok_and(|x| x > 1), false);
|
|
607
|
+
///
|
|
608
|
+
/// let x: Result<u32, &str> = Err("hey");
|
|
609
|
+
/// assert_eq!(x.is_ok_and(|x| x > 1), false);
|
|
610
|
+
///
|
|
611
|
+
/// let x: Result<String, &str> = Ok("ownership".to_string());
|
|
612
|
+
/// assert_eq!(x.as_ref().is_ok_and(|x| x.len() > 1), true);
|
|
613
|
+
/// println!("still alive {:?}", x);
|
|
614
|
+
/// ```
|
|
615
|
+
#[must_use]
|
|
616
|
+
#[inline]
|
|
617
|
+
#[stable(feature = "is_some_and", since = "1.70.0")]
|
|
618
|
+
#[rustc_const_unstable(feature = "const_result_trait_fn", issue = "144211")]
|
|
619
|
+
pub const fn is_ok_and<F>(self, f: F) -> bool
|
|
620
|
+
where
|
|
621
|
+
F: [const] FnOnce(T) -> bool + [const] Destruct,
|
|
622
|
+
T: [const] Destruct,
|
|
623
|
+
E: [const] Destruct,
|
|
624
|
+
{
|
|
625
|
+
match self {
|
|
626
|
+
Err(_) => false,
|
|
627
|
+
Ok(x) => f(x),
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
/// Returns `true` if the result is [`Err`].
|
|
632
|
+
///
|
|
633
|
+
/// # Examples
|
|
634
|
+
///
|
|
635
|
+
/// ```
|
|
636
|
+
/// let x: Result<i32, &str> = Ok(-3);
|
|
637
|
+
/// assert_eq!(x.is_err(), false);
|
|
638
|
+
///
|
|
639
|
+
/// let x: Result<i32, &str> = Err("Some error message");
|
|
640
|
+
/// assert_eq!(x.is_err(), true);
|
|
641
|
+
/// ```
|
|
642
|
+
#[must_use = "if you intended to assert that this is err, consider `.unwrap_err()` instead"]
|
|
643
|
+
#[rustc_const_stable(feature = "const_result_basics", since = "1.48.0")]
|
|
644
|
+
#[inline]
|
|
645
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
646
|
+
pub const fn is_err(&self) -> bool {
|
|
647
|
+
!self.is_ok()
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
/// Returns `true` if the result is [`Err`] and the value inside of it matches a predicate.
|
|
651
|
+
///
|
|
652
|
+
/// # Examples
|
|
653
|
+
///
|
|
654
|
+
/// ```
|
|
655
|
+
/// use std::io::{Error, ErrorKind};
|
|
656
|
+
///
|
|
657
|
+
/// let x: Result<u32, Error> = Err(Error::new(ErrorKind::NotFound, "!"));
|
|
658
|
+
/// assert_eq!(x.is_err_and(|x| x.kind() == ErrorKind::NotFound), true);
|
|
659
|
+
///
|
|
660
|
+
/// let x: Result<u32, Error> = Err(Error::new(ErrorKind::PermissionDenied, "!"));
|
|
661
|
+
/// assert_eq!(x.is_err_and(|x| x.kind() == ErrorKind::NotFound), false);
|
|
662
|
+
///
|
|
663
|
+
/// let x: Result<u32, Error> = Ok(123);
|
|
664
|
+
/// assert_eq!(x.is_err_and(|x| x.kind() == ErrorKind::NotFound), false);
|
|
665
|
+
///
|
|
666
|
+
/// let x: Result<u32, String> = Err("ownership".to_string());
|
|
667
|
+
/// assert_eq!(x.as_ref().is_err_and(|x| x.len() > 1), true);
|
|
668
|
+
/// println!("still alive {:?}", x);
|
|
669
|
+
/// ```
|
|
670
|
+
#[must_use]
|
|
671
|
+
#[inline]
|
|
672
|
+
#[stable(feature = "is_some_and", since = "1.70.0")]
|
|
673
|
+
#[rustc_const_unstable(feature = "const_result_trait_fn", issue = "144211")]
|
|
674
|
+
pub const fn is_err_and<F>(self, f: F) -> bool
|
|
675
|
+
where
|
|
676
|
+
F: [const] FnOnce(E) -> bool + [const] Destruct,
|
|
677
|
+
E: [const] Destruct,
|
|
678
|
+
T: [const] Destruct,
|
|
679
|
+
{
|
|
680
|
+
match self {
|
|
681
|
+
Ok(_) => false,
|
|
682
|
+
Err(e) => f(e),
|
|
683
|
+
}
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
/////////////////////////////////////////////////////////////////////////
|
|
687
|
+
// Adapter for each variant
|
|
688
|
+
/////////////////////////////////////////////////////////////////////////
|
|
689
|
+
|
|
690
|
+
/// Converts from `Result<T, E>` to [`Option<T>`].
|
|
691
|
+
///
|
|
692
|
+
/// Converts `self` into an [`Option<T>`], consuming `self`,
|
|
693
|
+
/// and discarding the error, if any.
|
|
694
|
+
///
|
|
695
|
+
/// # Examples
|
|
696
|
+
///
|
|
697
|
+
/// ```
|
|
698
|
+
/// let x: Result<u32, &str> = Ok(2);
|
|
699
|
+
/// assert_eq!(x.ok(), Some(2));
|
|
700
|
+
///
|
|
701
|
+
/// let x: Result<u32, &str> = Err("Nothing here");
|
|
702
|
+
/// assert_eq!(x.ok(), None);
|
|
703
|
+
/// ```
|
|
704
|
+
#[inline]
|
|
705
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
706
|
+
#[rustc_const_unstable(feature = "const_result_trait_fn", issue = "144211")]
|
|
707
|
+
#[rustc_diagnostic_item = "result_ok_method"]
|
|
708
|
+
pub const fn ok(self) -> Option<T>
|
|
709
|
+
where
|
|
710
|
+
T: [const] Destruct,
|
|
711
|
+
E: [const] Destruct,
|
|
712
|
+
{
|
|
713
|
+
match self {
|
|
714
|
+
Ok(x) => Some(x),
|
|
715
|
+
Err(_) => None,
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
/// Converts from `Result<T, E>` to [`Option<E>`].
|
|
720
|
+
///
|
|
721
|
+
/// Converts `self` into an [`Option<E>`], consuming `self`,
|
|
722
|
+
/// and discarding the success value, if any.
|
|
723
|
+
///
|
|
724
|
+
/// # Examples
|
|
725
|
+
///
|
|
726
|
+
/// ```
|
|
727
|
+
/// let x: Result<u32, &str> = Ok(2);
|
|
728
|
+
/// assert_eq!(x.err(), None);
|
|
729
|
+
///
|
|
730
|
+
/// let x: Result<u32, &str> = Err("Nothing here");
|
|
731
|
+
/// assert_eq!(x.err(), Some("Nothing here"));
|
|
732
|
+
/// ```
|
|
733
|
+
#[inline]
|
|
734
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
735
|
+
#[rustc_const_unstable(feature = "const_result_trait_fn", issue = "144211")]
|
|
736
|
+
pub const fn err(self) -> Option<E>
|
|
737
|
+
where
|
|
738
|
+
T: [const] Destruct,
|
|
739
|
+
E: [const] Destruct,
|
|
740
|
+
{
|
|
741
|
+
match self {
|
|
742
|
+
Ok(_) => None,
|
|
743
|
+
Err(x) => Some(x),
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
/////////////////////////////////////////////////////////////////////////
|
|
748
|
+
// Adapter for working with references
|
|
749
|
+
/////////////////////////////////////////////////////////////////////////
|
|
750
|
+
|
|
751
|
+
/// Converts from `&Result<T, E>` to `Result<&T, &E>`.
|
|
752
|
+
///
|
|
753
|
+
/// Produces a new `Result`, containing a reference
|
|
754
|
+
/// into the original, leaving the original in place.
|
|
755
|
+
///
|
|
756
|
+
/// # Examples
|
|
757
|
+
///
|
|
758
|
+
/// ```
|
|
759
|
+
/// let x: Result<u32, &str> = Ok(2);
|
|
760
|
+
/// assert_eq!(x.as_ref(), Ok(&2));
|
|
761
|
+
///
|
|
762
|
+
/// let x: Result<u32, &str> = Err("Error");
|
|
763
|
+
/// assert_eq!(x.as_ref(), Err(&"Error"));
|
|
764
|
+
/// ```
|
|
765
|
+
#[inline]
|
|
766
|
+
#[rustc_const_stable(feature = "const_result_basics", since = "1.48.0")]
|
|
767
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
768
|
+
pub const fn as_ref(&self) -> Result<&T, &E> {
|
|
769
|
+
match *self {
|
|
770
|
+
Ok(ref x) => Ok(x),
|
|
771
|
+
Err(ref x) => Err(x),
|
|
772
|
+
}
|
|
773
|
+
}
|
|
774
|
+
|
|
775
|
+
/// Converts from `&mut Result<T, E>` to `Result<&mut T, &mut E>`.
|
|
776
|
+
///
|
|
777
|
+
/// # Examples
|
|
778
|
+
///
|
|
779
|
+
/// ```
|
|
780
|
+
/// fn mutate(r: &mut Result<i32, i32>) {
|
|
781
|
+
/// match r.as_mut() {
|
|
782
|
+
/// Ok(v) => *v = 42,
|
|
783
|
+
/// Err(e) => *e = 0,
|
|
784
|
+
/// }
|
|
785
|
+
/// }
|
|
786
|
+
///
|
|
787
|
+
/// let mut x: Result<i32, i32> = Ok(2);
|
|
788
|
+
/// mutate(&mut x);
|
|
789
|
+
/// assert_eq!(x.unwrap(), 42);
|
|
790
|
+
///
|
|
791
|
+
/// let mut x: Result<i32, i32> = Err(13);
|
|
792
|
+
/// mutate(&mut x);
|
|
793
|
+
/// assert_eq!(x.unwrap_err(), 0);
|
|
794
|
+
/// ```
|
|
795
|
+
#[inline]
|
|
796
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
797
|
+
#[rustc_const_stable(feature = "const_result", since = "1.83.0")]
|
|
798
|
+
pub const fn as_mut(&mut self) -> Result<&mut T, &mut E> {
|
|
799
|
+
match *self {
|
|
800
|
+
Ok(ref mut x) => Ok(x),
|
|
801
|
+
Err(ref mut x) => Err(x),
|
|
802
|
+
}
|
|
803
|
+
}
|
|
804
|
+
|
|
805
|
+
/////////////////////////////////////////////////////////////////////////
|
|
806
|
+
// Transforming contained values
|
|
807
|
+
/////////////////////////////////////////////////////////////////////////
|
|
808
|
+
|
|
809
|
+
/// Maps a `Result<T, E>` to `Result<U, E>` by applying a function to a
|
|
810
|
+
/// contained [`Ok`] value, leaving an [`Err`] value untouched.
|
|
811
|
+
///
|
|
812
|
+
/// This function can be used to compose the results of two functions.
|
|
813
|
+
///
|
|
814
|
+
/// # Examples
|
|
815
|
+
///
|
|
816
|
+
/// Print the numbers on each line of a string multiplied by two.
|
|
817
|
+
///
|
|
818
|
+
/// ```
|
|
819
|
+
/// let line = "1\n2\n3\n4\n";
|
|
820
|
+
///
|
|
821
|
+
/// for num in line.lines() {
|
|
822
|
+
/// match num.parse::<i32>().map(|i| i * 2) {
|
|
823
|
+
/// Ok(n) => println!("{n}"),
|
|
824
|
+
/// Err(..) => {}
|
|
825
|
+
/// }
|
|
826
|
+
/// }
|
|
827
|
+
/// ```
|
|
828
|
+
#[inline]
|
|
829
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
830
|
+
#[rustc_const_unstable(feature = "const_result_trait_fn", issue = "144211")]
|
|
831
|
+
pub const fn map<U, F>(self, op: F) -> Result<U, E>
|
|
832
|
+
where
|
|
833
|
+
F: [const] FnOnce(T) -> U + [const] Destruct,
|
|
834
|
+
{
|
|
835
|
+
match self {
|
|
836
|
+
Ok(t) => Ok(op(t)),
|
|
837
|
+
Err(e) => Err(e),
|
|
838
|
+
}
|
|
839
|
+
}
|
|
840
|
+
|
|
841
|
+
/// Returns the provided default (if [`Err`]), or
|
|
842
|
+
/// applies a function to the contained value (if [`Ok`]).
|
|
843
|
+
///
|
|
844
|
+
/// Arguments passed to `map_or` are eagerly evaluated; if you are passing
|
|
845
|
+
/// the result of a function call, it is recommended to use [`map_or_else`],
|
|
846
|
+
/// which is lazily evaluated.
|
|
847
|
+
///
|
|
848
|
+
/// [`map_or_else`]: Result::map_or_else
|
|
849
|
+
///
|
|
850
|
+
/// # Examples
|
|
851
|
+
///
|
|
852
|
+
/// ```
|
|
853
|
+
/// let x: Result<_, &str> = Ok("foo");
|
|
854
|
+
/// assert_eq!(x.map_or(42, |v| v.len()), 3);
|
|
855
|
+
///
|
|
856
|
+
/// let x: Result<&str, _> = Err("bar");
|
|
857
|
+
/// assert_eq!(x.map_or(42, |v| v.len()), 42);
|
|
858
|
+
/// ```
|
|
859
|
+
#[inline]
|
|
860
|
+
#[stable(feature = "result_map_or", since = "1.41.0")]
|
|
861
|
+
#[rustc_const_unstable(feature = "const_result_trait_fn", issue = "144211")]
|
|
862
|
+
#[must_use = "if you don't need the returned value, use `if let` instead"]
|
|
863
|
+
pub const fn map_or<U, F>(self, default: U, f: F) -> U
|
|
864
|
+
where
|
|
865
|
+
F: [const] FnOnce(T) -> U + [const] Destruct,
|
|
866
|
+
T: [const] Destruct,
|
|
867
|
+
E: [const] Destruct,
|
|
868
|
+
U: [const] Destruct,
|
|
869
|
+
{
|
|
870
|
+
match self {
|
|
871
|
+
Ok(t) => f(t),
|
|
872
|
+
Err(_) => default,
|
|
873
|
+
}
|
|
874
|
+
}
|
|
875
|
+
|
|
876
|
+
/// Maps a `Result<T, E>` to `U` by applying fallback function `default` to
|
|
877
|
+
/// a contained [`Err`] value, or function `f` to a contained [`Ok`] value.
|
|
878
|
+
///
|
|
879
|
+
/// This function can be used to unpack a successful result
|
|
880
|
+
/// while handling an error.
|
|
881
|
+
///
|
|
882
|
+
///
|
|
883
|
+
/// # Examples
|
|
884
|
+
///
|
|
885
|
+
/// ```
|
|
886
|
+
/// let k = 21;
|
|
887
|
+
///
|
|
888
|
+
/// let x : Result<_, &str> = Ok("foo");
|
|
889
|
+
/// assert_eq!(x.map_or_else(|e| k * 2, |v| v.len()), 3);
|
|
890
|
+
///
|
|
891
|
+
/// let x : Result<&str, _> = Err("bar");
|
|
892
|
+
/// assert_eq!(x.map_or_else(|e| k * 2, |v| v.len()), 42);
|
|
893
|
+
/// ```
|
|
894
|
+
#[inline]
|
|
895
|
+
#[stable(feature = "result_map_or_else", since = "1.41.0")]
|
|
896
|
+
#[rustc_const_unstable(feature = "const_result_trait_fn", issue = "144211")]
|
|
897
|
+
pub const fn map_or_else<U, D, F>(self, default: D, f: F) -> U
|
|
898
|
+
where
|
|
899
|
+
D: [const] FnOnce(E) -> U + [const] Destruct,
|
|
900
|
+
F: [const] FnOnce(T) -> U + [const] Destruct,
|
|
901
|
+
{
|
|
902
|
+
match self {
|
|
903
|
+
Ok(t) => f(t),
|
|
904
|
+
Err(e) => default(e),
|
|
905
|
+
}
|
|
906
|
+
}
|
|
907
|
+
|
|
908
|
+
/// Maps a `Result<T, E>` to a `U` by applying function `f` to the contained
|
|
909
|
+
/// value if the result is [`Ok`], otherwise if [`Err`], returns the
|
|
910
|
+
/// [default value] for the type `U`.
|
|
911
|
+
///
|
|
912
|
+
/// # Examples
|
|
913
|
+
///
|
|
914
|
+
/// ```
|
|
915
|
+
/// #![feature(result_option_map_or_default)]
|
|
916
|
+
///
|
|
917
|
+
/// let x: Result<_, &str> = Ok("foo");
|
|
918
|
+
/// let y: Result<&str, _> = Err("bar");
|
|
919
|
+
///
|
|
920
|
+
/// assert_eq!(x.map_or_default(|x| x.len()), 3);
|
|
921
|
+
/// assert_eq!(y.map_or_default(|y| y.len()), 0);
|
|
922
|
+
/// ```
|
|
923
|
+
///
|
|
924
|
+
/// [default value]: Default::default
|
|
925
|
+
#[inline]
|
|
926
|
+
#[unstable(feature = "result_option_map_or_default", issue = "138099")]
|
|
927
|
+
#[rustc_const_unstable(feature = "const_result_trait_fn", issue = "144211")]
|
|
928
|
+
pub const fn map_or_default<U, F>(self, f: F) -> U
|
|
929
|
+
where
|
|
930
|
+
F: [const] FnOnce(T) -> U + [const] Destruct,
|
|
931
|
+
U: [const] Default,
|
|
932
|
+
T: [const] Destruct,
|
|
933
|
+
E: [const] Destruct,
|
|
934
|
+
{
|
|
935
|
+
match self {
|
|
936
|
+
Ok(t) => f(t),
|
|
937
|
+
Err(_) => U::default(),
|
|
938
|
+
}
|
|
939
|
+
}
|
|
940
|
+
|
|
941
|
+
/// Maps a `Result<T, E>` to `Result<T, F>` by applying a function to a
|
|
942
|
+
/// contained [`Err`] value, leaving an [`Ok`] value untouched.
|
|
943
|
+
///
|
|
944
|
+
/// This function can be used to pass through a successful result while handling
|
|
945
|
+
/// an error.
|
|
946
|
+
///
|
|
947
|
+
///
|
|
948
|
+
/// # Examples
|
|
949
|
+
///
|
|
950
|
+
/// ```
|
|
951
|
+
/// fn stringify(x: u32) -> String { format!("error code: {x}") }
|
|
952
|
+
///
|
|
953
|
+
/// let x: Result<u32, u32> = Ok(2);
|
|
954
|
+
/// assert_eq!(x.map_err(stringify), Ok(2));
|
|
955
|
+
///
|
|
956
|
+
/// let x: Result<u32, u32> = Err(13);
|
|
957
|
+
/// assert_eq!(x.map_err(stringify), Err("error code: 13".to_string()));
|
|
958
|
+
/// ```
|
|
959
|
+
#[inline]
|
|
960
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
961
|
+
#[rustc_const_unstable(feature = "const_result_trait_fn", issue = "144211")]
|
|
962
|
+
pub const fn map_err<F, O>(self, op: O) -> Result<T, F>
|
|
963
|
+
where
|
|
964
|
+
O: [const] FnOnce(E) -> F + [const] Destruct,
|
|
965
|
+
{
|
|
966
|
+
match self {
|
|
967
|
+
Ok(t) => Ok(t),
|
|
968
|
+
Err(e) => Err(op(e)),
|
|
969
|
+
}
|
|
970
|
+
}
|
|
971
|
+
|
|
972
|
+
/// Calls a function with a reference to the contained value if [`Ok`].
|
|
973
|
+
///
|
|
974
|
+
/// Returns the original result.
|
|
975
|
+
///
|
|
976
|
+
/// # Examples
|
|
977
|
+
///
|
|
978
|
+
/// ```
|
|
979
|
+
/// let x: u8 = "4"
|
|
980
|
+
/// .parse::<u8>()
|
|
981
|
+
/// .inspect(|x| println!("original: {x}"))
|
|
982
|
+
/// .map(|x| x.pow(3))
|
|
983
|
+
/// .expect("failed to parse number");
|
|
984
|
+
/// ```
|
|
985
|
+
#[inline]
|
|
986
|
+
#[stable(feature = "result_option_inspect", since = "1.76.0")]
|
|
987
|
+
#[rustc_const_unstable(feature = "const_result_trait_fn", issue = "144211")]
|
|
988
|
+
pub const fn inspect<F>(self, f: F) -> Self
|
|
989
|
+
where
|
|
990
|
+
F: [const] FnOnce(&T) + [const] Destruct,
|
|
991
|
+
{
|
|
992
|
+
if let Ok(ref t) = self {
|
|
993
|
+
f(t);
|
|
994
|
+
}
|
|
995
|
+
|
|
996
|
+
self
|
|
997
|
+
}
|
|
998
|
+
|
|
999
|
+
/// Calls a function with a reference to the contained value if [`Err`].
|
|
1000
|
+
///
|
|
1001
|
+
/// Returns the original result.
|
|
1002
|
+
///
|
|
1003
|
+
/// # Examples
|
|
1004
|
+
///
|
|
1005
|
+
/// ```
|
|
1006
|
+
/// use std::{fs, io};
|
|
1007
|
+
///
|
|
1008
|
+
/// fn read() -> io::Result<String> {
|
|
1009
|
+
/// fs::read_to_string("address.txt")
|
|
1010
|
+
/// .inspect_err(|e| eprintln!("failed to read file: {e}"))
|
|
1011
|
+
/// }
|
|
1012
|
+
/// ```
|
|
1013
|
+
#[inline]
|
|
1014
|
+
#[stable(feature = "result_option_inspect", since = "1.76.0")]
|
|
1015
|
+
#[rustc_const_unstable(feature = "const_result_trait_fn", issue = "144211")]
|
|
1016
|
+
pub const fn inspect_err<F>(self, f: F) -> Self
|
|
1017
|
+
where
|
|
1018
|
+
F: [const] FnOnce(&E) + [const] Destruct,
|
|
1019
|
+
{
|
|
1020
|
+
if let Err(ref e) = self {
|
|
1021
|
+
f(e);
|
|
1022
|
+
}
|
|
1023
|
+
|
|
1024
|
+
self
|
|
1025
|
+
}
|
|
1026
|
+
|
|
1027
|
+
/// Converts from `Result<T, E>` (or `&Result<T, E>`) to `Result<&<T as Deref>::Target, &E>`.
|
|
1028
|
+
///
|
|
1029
|
+
/// Coerces the [`Ok`] variant of the original [`Result`] via [`Deref`](crate::ops::Deref)
|
|
1030
|
+
/// and returns the new [`Result`].
|
|
1031
|
+
///
|
|
1032
|
+
/// # Examples
|
|
1033
|
+
///
|
|
1034
|
+
/// ```
|
|
1035
|
+
/// let x: Result<String, u32> = Ok("hello".to_string());
|
|
1036
|
+
/// let y: Result<&str, &u32> = Ok("hello");
|
|
1037
|
+
/// assert_eq!(x.as_deref(), y);
|
|
1038
|
+
///
|
|
1039
|
+
/// let x: Result<String, u32> = Err(42);
|
|
1040
|
+
/// let y: Result<&str, &u32> = Err(&42);
|
|
1041
|
+
/// assert_eq!(x.as_deref(), y);
|
|
1042
|
+
/// ```
|
|
1043
|
+
#[inline]
|
|
1044
|
+
#[stable(feature = "inner_deref", since = "1.47.0")]
|
|
1045
|
+
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
|
|
1046
|
+
pub const fn as_deref(&self) -> Result<&T::Target, &E>
|
|
1047
|
+
where
|
|
1048
|
+
T: [const] Deref,
|
|
1049
|
+
{
|
|
1050
|
+
self.as_ref().map(Deref::deref)
|
|
1051
|
+
}
|
|
1052
|
+
|
|
1053
|
+
/// Converts from `Result<T, E>` (or `&mut Result<T, E>`) to `Result<&mut <T as DerefMut>::Target, &mut E>`.
|
|
1054
|
+
///
|
|
1055
|
+
/// Coerces the [`Ok`] variant of the original [`Result`] via [`DerefMut`](crate::ops::DerefMut)
|
|
1056
|
+
/// and returns the new [`Result`].
|
|
1057
|
+
///
|
|
1058
|
+
/// # Examples
|
|
1059
|
+
///
|
|
1060
|
+
/// ```
|
|
1061
|
+
/// let mut s = "HELLO".to_string();
|
|
1062
|
+
/// let mut x: Result<String, u32> = Ok("hello".to_string());
|
|
1063
|
+
/// let y: Result<&mut str, &mut u32> = Ok(&mut s);
|
|
1064
|
+
/// assert_eq!(x.as_deref_mut().map(|x| { x.make_ascii_uppercase(); x }), y);
|
|
1065
|
+
///
|
|
1066
|
+
/// let mut i = 42;
|
|
1067
|
+
/// let mut x: Result<String, u32> = Err(42);
|
|
1068
|
+
/// let y: Result<&mut str, &mut u32> = Err(&mut i);
|
|
1069
|
+
/// assert_eq!(x.as_deref_mut().map(|x| { x.make_ascii_uppercase(); x }), y);
|
|
1070
|
+
/// ```
|
|
1071
|
+
#[inline]
|
|
1072
|
+
#[stable(feature = "inner_deref", since = "1.47.0")]
|
|
1073
|
+
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
|
|
1074
|
+
pub const fn as_deref_mut(&mut self) -> Result<&mut T::Target, &mut E>
|
|
1075
|
+
where
|
|
1076
|
+
T: [const] DerefMut,
|
|
1077
|
+
{
|
|
1078
|
+
self.as_mut().map(DerefMut::deref_mut)
|
|
1079
|
+
}
|
|
1080
|
+
|
|
1081
|
+
/////////////////////////////////////////////////////////////////////////
|
|
1082
|
+
// Iterator constructors
|
|
1083
|
+
/////////////////////////////////////////////////////////////////////////
|
|
1084
|
+
|
|
1085
|
+
/// Returns an iterator over the possibly contained value.
|
|
1086
|
+
///
|
|
1087
|
+
/// The iterator yields one value if the result is [`Result::Ok`], otherwise none.
|
|
1088
|
+
///
|
|
1089
|
+
/// # Examples
|
|
1090
|
+
///
|
|
1091
|
+
/// ```
|
|
1092
|
+
/// let x: Result<u32, &str> = Ok(7);
|
|
1093
|
+
/// assert_eq!(x.iter().next(), Some(&7));
|
|
1094
|
+
///
|
|
1095
|
+
/// let x: Result<u32, &str> = Err("nothing!");
|
|
1096
|
+
/// assert_eq!(x.iter().next(), None);
|
|
1097
|
+
/// ```
|
|
1098
|
+
#[inline]
|
|
1099
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
1100
|
+
#[rustc_const_unstable(feature = "const_result_trait_fn", issue = "144211")]
|
|
1101
|
+
pub const fn iter(&self) -> Iter<'_, T> {
|
|
1102
|
+
Iter { inner: self.as_ref().ok() }
|
|
1103
|
+
}
|
|
1104
|
+
|
|
1105
|
+
/// Returns a mutable iterator over the possibly contained value.
|
|
1106
|
+
///
|
|
1107
|
+
/// The iterator yields one value if the result is [`Result::Ok`], otherwise none.
|
|
1108
|
+
///
|
|
1109
|
+
/// # Examples
|
|
1110
|
+
///
|
|
1111
|
+
/// ```
|
|
1112
|
+
/// let mut x: Result<u32, &str> = Ok(7);
|
|
1113
|
+
/// match x.iter_mut().next() {
|
|
1114
|
+
/// Some(v) => *v = 40,
|
|
1115
|
+
/// None => {},
|
|
1116
|
+
/// }
|
|
1117
|
+
/// assert_eq!(x, Ok(40));
|
|
1118
|
+
///
|
|
1119
|
+
/// let mut x: Result<u32, &str> = Err("nothing!");
|
|
1120
|
+
/// assert_eq!(x.iter_mut().next(), None);
|
|
1121
|
+
/// ```
|
|
1122
|
+
#[inline]
|
|
1123
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
1124
|
+
#[rustc_const_unstable(feature = "const_result_trait_fn", issue = "144211")]
|
|
1125
|
+
pub const fn iter_mut(&mut self) -> IterMut<'_, T> {
|
|
1126
|
+
IterMut { inner: self.as_mut().ok() }
|
|
1127
|
+
}
|
|
1128
|
+
|
|
1129
|
+
/////////////////////////////////////////////////////////////////////////
|
|
1130
|
+
// Extract a value
|
|
1131
|
+
/////////////////////////////////////////////////////////////////////////
|
|
1132
|
+
|
|
1133
|
+
/// Returns the contained [`Ok`] value, consuming the `self` value.
|
|
1134
|
+
///
|
|
1135
|
+
/// Because this function may panic, its use is generally discouraged.
|
|
1136
|
+
/// Instead, prefer to use pattern matching and handle the [`Err`]
|
|
1137
|
+
/// case explicitly, or call [`unwrap_or`], [`unwrap_or_else`], or
|
|
1138
|
+
/// [`unwrap_or_default`].
|
|
1139
|
+
///
|
|
1140
|
+
/// [`unwrap_or`]: Result::unwrap_or
|
|
1141
|
+
/// [`unwrap_or_else`]: Result::unwrap_or_else
|
|
1142
|
+
/// [`unwrap_or_default`]: Result::unwrap_or_default
|
|
1143
|
+
///
|
|
1144
|
+
/// # Panics
|
|
1145
|
+
///
|
|
1146
|
+
/// Panics if the value is an [`Err`], with a panic message including the
|
|
1147
|
+
/// passed message, and the content of the [`Err`].
|
|
1148
|
+
///
|
|
1149
|
+
///
|
|
1150
|
+
/// # Examples
|
|
1151
|
+
///
|
|
1152
|
+
/// ```should_panic
|
|
1153
|
+
/// let x: Result<u32, &str> = Err("emergency failure");
|
|
1154
|
+
/// x.expect("Testing expect"); // panics with `Testing expect: emergency failure`
|
|
1155
|
+
/// ```
|
|
1156
|
+
///
|
|
1157
|
+
/// # Recommended Message Style
|
|
1158
|
+
///
|
|
1159
|
+
/// We recommend that `expect` messages are used to describe the reason you
|
|
1160
|
+
/// _expect_ the `Result` should be `Ok`.
|
|
1161
|
+
///
|
|
1162
|
+
/// ```should_panic
|
|
1163
|
+
/// let path = std::env::var("IMPORTANT_PATH")
|
|
1164
|
+
/// .expect("env variable `IMPORTANT_PATH` should be set by `wrapper_script.sh`");
|
|
1165
|
+
/// ```
|
|
1166
|
+
///
|
|
1167
|
+
/// **Hint**: If you're having trouble remembering how to phrase expect
|
|
1168
|
+
/// error messages remember to focus on the word "should" as in "env
|
|
1169
|
+
/// variable should be set by blah" or "the given binary should be available
|
|
1170
|
+
/// and executable by the current user".
|
|
1171
|
+
///
|
|
1172
|
+
/// For more detail on expect message styles and the reasoning behind our recommendation please
|
|
1173
|
+
/// refer to the section on ["Common Message
|
|
1174
|
+
/// Styles"](../../std/error/index.html#common-message-styles) in the
|
|
1175
|
+
/// [`std::error`](../../std/error/index.html) module docs.
|
|
1176
|
+
#[inline]
|
|
1177
|
+
#[track_caller]
|
|
1178
|
+
#[stable(feature = "result_expect", since = "1.4.0")]
|
|
1179
|
+
pub fn expect(self, msg: &str) -> T
|
|
1180
|
+
where
|
|
1181
|
+
E: fmt::Debug,
|
|
1182
|
+
{
|
|
1183
|
+
match self {
|
|
1184
|
+
Ok(t) => t,
|
|
1185
|
+
Err(e) => unwrap_failed(msg, &e),
|
|
1186
|
+
}
|
|
1187
|
+
}
|
|
1188
|
+
|
|
1189
|
+
/// Returns the contained [`Ok`] value, consuming the `self` value.
|
|
1190
|
+
///
|
|
1191
|
+
/// Because this function may panic, its use is generally discouraged.
|
|
1192
|
+
/// Panics are meant for unrecoverable errors, and
|
|
1193
|
+
/// [may abort the entire program][panic-abort].
|
|
1194
|
+
///
|
|
1195
|
+
/// Instead, prefer to use [the `?` (try) operator][try-operator], or pattern matching
|
|
1196
|
+
/// to handle the [`Err`] case explicitly, or call [`unwrap_or`],
|
|
1197
|
+
/// [`unwrap_or_else`], or [`unwrap_or_default`].
|
|
1198
|
+
///
|
|
1199
|
+
/// [panic-abort]: https://doc.rust-lang.org/book/ch09-01-unrecoverable-errors-with-panic.html
|
|
1200
|
+
/// [try-operator]: https://doc.rust-lang.org/book/ch09-02-recoverable-errors-with-result.html#a-shortcut-for-propagating-errors-the--operator
|
|
1201
|
+
/// [`unwrap_or`]: Result::unwrap_or
|
|
1202
|
+
/// [`unwrap_or_else`]: Result::unwrap_or_else
|
|
1203
|
+
/// [`unwrap_or_default`]: Result::unwrap_or_default
|
|
1204
|
+
///
|
|
1205
|
+
/// # Panics
|
|
1206
|
+
///
|
|
1207
|
+
/// Panics if the value is an [`Err`], with a panic message provided by the
|
|
1208
|
+
/// [`Err`]'s value.
|
|
1209
|
+
///
|
|
1210
|
+
///
|
|
1211
|
+
/// # Examples
|
|
1212
|
+
///
|
|
1213
|
+
/// Basic usage:
|
|
1214
|
+
///
|
|
1215
|
+
/// ```
|
|
1216
|
+
/// let x: Result<u32, &str> = Ok(2);
|
|
1217
|
+
/// assert_eq!(x.unwrap(), 2);
|
|
1218
|
+
/// ```
|
|
1219
|
+
///
|
|
1220
|
+
/// ```should_panic
|
|
1221
|
+
/// let x: Result<u32, &str> = Err("emergency failure");
|
|
1222
|
+
/// x.unwrap(); // panics with `emergency failure`
|
|
1223
|
+
/// ```
|
|
1224
|
+
#[inline(always)]
|
|
1225
|
+
#[track_caller]
|
|
1226
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
1227
|
+
pub fn unwrap(self) -> T
|
|
1228
|
+
where
|
|
1229
|
+
E: fmt::Debug,
|
|
1230
|
+
{
|
|
1231
|
+
match self {
|
|
1232
|
+
Ok(t) => t,
|
|
1233
|
+
Err(e) => unwrap_failed("called `Result::unwrap()` on an `Err` value", &e),
|
|
1234
|
+
}
|
|
1235
|
+
}
|
|
1236
|
+
|
|
1237
|
+
/// Returns the contained [`Ok`] value or a default
|
|
1238
|
+
///
|
|
1239
|
+
/// Consumes the `self` argument then, if [`Ok`], returns the contained
|
|
1240
|
+
/// value, otherwise if [`Err`], returns the default value for that
|
|
1241
|
+
/// type.
|
|
1242
|
+
///
|
|
1243
|
+
/// # Examples
|
|
1244
|
+
///
|
|
1245
|
+
/// Converts a string to an integer, turning poorly-formed strings
|
|
1246
|
+
/// into 0 (the default value for integers). [`parse`] converts
|
|
1247
|
+
/// a string to any other type that implements [`FromStr`], returning an
|
|
1248
|
+
/// [`Err`] on error.
|
|
1249
|
+
///
|
|
1250
|
+
/// ```
|
|
1251
|
+
/// let good_year_from_input = "1909";
|
|
1252
|
+
/// let bad_year_from_input = "190blarg";
|
|
1253
|
+
/// let good_year = good_year_from_input.parse().unwrap_or_default();
|
|
1254
|
+
/// let bad_year = bad_year_from_input.parse().unwrap_or_default();
|
|
1255
|
+
///
|
|
1256
|
+
/// assert_eq!(1909, good_year);
|
|
1257
|
+
/// assert_eq!(0, bad_year);
|
|
1258
|
+
/// ```
|
|
1259
|
+
///
|
|
1260
|
+
/// [`parse`]: str::parse
|
|
1261
|
+
/// [`FromStr`]: crate::str::FromStr
|
|
1262
|
+
#[inline]
|
|
1263
|
+
#[stable(feature = "result_unwrap_or_default", since = "1.16.0")]
|
|
1264
|
+
#[rustc_const_unstable(feature = "const_result_trait_fn", issue = "144211")]
|
|
1265
|
+
pub const fn unwrap_or_default(self) -> T
|
|
1266
|
+
where
|
|
1267
|
+
T: [const] Default + [const] Destruct,
|
|
1268
|
+
E: [const] Destruct,
|
|
1269
|
+
{
|
|
1270
|
+
match self {
|
|
1271
|
+
Ok(x) => x,
|
|
1272
|
+
Err(_) => Default::default(),
|
|
1273
|
+
}
|
|
1274
|
+
}
|
|
1275
|
+
|
|
1276
|
+
/// Returns the contained [`Err`] value, consuming the `self` value.
|
|
1277
|
+
///
|
|
1278
|
+
/// # Panics
|
|
1279
|
+
///
|
|
1280
|
+
/// Panics if the value is an [`Ok`], with a panic message including the
|
|
1281
|
+
/// passed message, and the content of the [`Ok`].
|
|
1282
|
+
///
|
|
1283
|
+
///
|
|
1284
|
+
/// # Examples
|
|
1285
|
+
///
|
|
1286
|
+
/// ```should_panic
|
|
1287
|
+
/// let x: Result<u32, &str> = Ok(10);
|
|
1288
|
+
/// x.expect_err("Testing expect_err"); // panics with `Testing expect_err: 10`
|
|
1289
|
+
/// ```
|
|
1290
|
+
#[inline]
|
|
1291
|
+
#[track_caller]
|
|
1292
|
+
#[stable(feature = "result_expect_err", since = "1.17.0")]
|
|
1293
|
+
pub fn expect_err(self, msg: &str) -> E
|
|
1294
|
+
where
|
|
1295
|
+
T: fmt::Debug,
|
|
1296
|
+
{
|
|
1297
|
+
match self {
|
|
1298
|
+
Ok(t) => unwrap_failed(msg, &t),
|
|
1299
|
+
Err(e) => e,
|
|
1300
|
+
}
|
|
1301
|
+
}
|
|
1302
|
+
|
|
1303
|
+
/// Returns the contained [`Err`] value, consuming the `self` value.
|
|
1304
|
+
///
|
|
1305
|
+
/// # Panics
|
|
1306
|
+
///
|
|
1307
|
+
/// Panics if the value is an [`Ok`], with a custom panic message provided
|
|
1308
|
+
/// by the [`Ok`]'s value.
|
|
1309
|
+
///
|
|
1310
|
+
/// # Examples
|
|
1311
|
+
///
|
|
1312
|
+
/// ```should_panic
|
|
1313
|
+
/// let x: Result<u32, &str> = Ok(2);
|
|
1314
|
+
/// x.unwrap_err(); // panics with `2`
|
|
1315
|
+
/// ```
|
|
1316
|
+
///
|
|
1317
|
+
/// ```
|
|
1318
|
+
/// let x: Result<u32, &str> = Err("emergency failure");
|
|
1319
|
+
/// assert_eq!(x.unwrap_err(), "emergency failure");
|
|
1320
|
+
/// ```
|
|
1321
|
+
#[inline]
|
|
1322
|
+
#[track_caller]
|
|
1323
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
1324
|
+
pub fn unwrap_err(self) -> E
|
|
1325
|
+
where
|
|
1326
|
+
T: fmt::Debug,
|
|
1327
|
+
{
|
|
1328
|
+
match self {
|
|
1329
|
+
Ok(t) => unwrap_failed("called `Result::unwrap_err()` on an `Ok` value", &t),
|
|
1330
|
+
Err(e) => e,
|
|
1331
|
+
}
|
|
1332
|
+
}
|
|
1333
|
+
|
|
1334
|
+
/// Returns the contained [`Ok`] value, but never panics.
|
|
1335
|
+
///
|
|
1336
|
+
/// Unlike [`unwrap`], this method is known to never panic on the
|
|
1337
|
+
/// result types it is implemented for. Therefore, it can be used
|
|
1338
|
+
/// instead of `unwrap` as a maintainability safeguard that will fail
|
|
1339
|
+
/// to compile if the error type of the `Result` is later changed
|
|
1340
|
+
/// to an error that can actually occur.
|
|
1341
|
+
///
|
|
1342
|
+
/// [`unwrap`]: Result::unwrap
|
|
1343
|
+
///
|
|
1344
|
+
/// # Examples
|
|
1345
|
+
///
|
|
1346
|
+
/// ```
|
|
1347
|
+
/// # #![feature(never_type)]
|
|
1348
|
+
/// # #![feature(unwrap_infallible)]
|
|
1349
|
+
///
|
|
1350
|
+
/// fn only_good_news() -> Result<String, !> {
|
|
1351
|
+
/// Ok("this is fine".into())
|
|
1352
|
+
/// }
|
|
1353
|
+
///
|
|
1354
|
+
/// let s: String = only_good_news().into_ok();
|
|
1355
|
+
/// println!("{s}");
|
|
1356
|
+
/// ```
|
|
1357
|
+
#[unstable(feature = "unwrap_infallible", reason = "newly added", issue = "61695")]
|
|
1358
|
+
#[inline]
|
|
1359
|
+
#[rustc_allow_const_fn_unstable(const_precise_live_drops)]
|
|
1360
|
+
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
|
|
1361
|
+
pub const fn into_ok(self) -> T
|
|
1362
|
+
where
|
|
1363
|
+
E: [const] Into<!>,
|
|
1364
|
+
{
|
|
1365
|
+
match self {
|
|
1366
|
+
Ok(x) => x,
|
|
1367
|
+
Err(e) => e.into(),
|
|
1368
|
+
}
|
|
1369
|
+
}
|
|
1370
|
+
|
|
1371
|
+
/// Returns the contained [`Err`] value, but never panics.
|
|
1372
|
+
///
|
|
1373
|
+
/// Unlike [`unwrap_err`], this method is known to never panic on the
|
|
1374
|
+
/// result types it is implemented for. Therefore, it can be used
|
|
1375
|
+
/// instead of `unwrap_err` as a maintainability safeguard that will fail
|
|
1376
|
+
/// to compile if the ok type of the `Result` is later changed
|
|
1377
|
+
/// to a type that can actually occur.
|
|
1378
|
+
///
|
|
1379
|
+
/// [`unwrap_err`]: Result::unwrap_err
|
|
1380
|
+
///
|
|
1381
|
+
/// # Examples
|
|
1382
|
+
///
|
|
1383
|
+
/// ```
|
|
1384
|
+
/// # #![feature(never_type)]
|
|
1385
|
+
/// # #![feature(unwrap_infallible)]
|
|
1386
|
+
///
|
|
1387
|
+
/// fn only_bad_news() -> Result<!, String> {
|
|
1388
|
+
/// Err("Oops, it failed".into())
|
|
1389
|
+
/// }
|
|
1390
|
+
///
|
|
1391
|
+
/// let error: String = only_bad_news().into_err();
|
|
1392
|
+
/// println!("{error}");
|
|
1393
|
+
/// ```
|
|
1394
|
+
#[unstable(feature = "unwrap_infallible", reason = "newly added", issue = "61695")]
|
|
1395
|
+
#[inline]
|
|
1396
|
+
#[rustc_allow_const_fn_unstable(const_precise_live_drops)]
|
|
1397
|
+
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
|
|
1398
|
+
pub const fn into_err(self) -> E
|
|
1399
|
+
where
|
|
1400
|
+
T: [const] Into<!>,
|
|
1401
|
+
{
|
|
1402
|
+
match self {
|
|
1403
|
+
Ok(x) => x.into(),
|
|
1404
|
+
Err(e) => e,
|
|
1405
|
+
}
|
|
1406
|
+
}
|
|
1407
|
+
|
|
1408
|
+
////////////////////////////////////////////////////////////////////////
|
|
1409
|
+
// Boolean operations on the values, eager and lazy
|
|
1410
|
+
/////////////////////////////////////////////////////////////////////////
|
|
1411
|
+
|
|
1412
|
+
/// Returns `res` if the result is [`Ok`], otherwise returns the [`Err`] value of `self`.
|
|
1413
|
+
///
|
|
1414
|
+
/// Arguments passed to `and` are eagerly evaluated; if you are passing the
|
|
1415
|
+
/// result of a function call, it is recommended to use [`and_then`], which is
|
|
1416
|
+
/// lazily evaluated.
|
|
1417
|
+
///
|
|
1418
|
+
/// [`and_then`]: Result::and_then
|
|
1419
|
+
///
|
|
1420
|
+
/// # Examples
|
|
1421
|
+
///
|
|
1422
|
+
/// ```
|
|
1423
|
+
/// let x: Result<u32, &str> = Ok(2);
|
|
1424
|
+
/// let y: Result<&str, &str> = Err("late error");
|
|
1425
|
+
/// assert_eq!(x.and(y), Err("late error"));
|
|
1426
|
+
///
|
|
1427
|
+
/// let x: Result<u32, &str> = Err("early error");
|
|
1428
|
+
/// let y: Result<&str, &str> = Ok("foo");
|
|
1429
|
+
/// assert_eq!(x.and(y), Err("early error"));
|
|
1430
|
+
///
|
|
1431
|
+
/// let x: Result<u32, &str> = Err("not a 2");
|
|
1432
|
+
/// let y: Result<&str, &str> = Err("late error");
|
|
1433
|
+
/// assert_eq!(x.and(y), Err("not a 2"));
|
|
1434
|
+
///
|
|
1435
|
+
/// let x: Result<u32, &str> = Ok(2);
|
|
1436
|
+
/// let y: Result<&str, &str> = Ok("different result type");
|
|
1437
|
+
/// assert_eq!(x.and(y), Ok("different result type"));
|
|
1438
|
+
/// ```
|
|
1439
|
+
#[inline]
|
|
1440
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
1441
|
+
#[rustc_const_unstable(feature = "const_result_trait_fn", issue = "144211")]
|
|
1442
|
+
pub const fn and<U>(self, res: Result<U, E>) -> Result<U, E>
|
|
1443
|
+
where
|
|
1444
|
+
T: [const] Destruct,
|
|
1445
|
+
E: [const] Destruct,
|
|
1446
|
+
U: [const] Destruct,
|
|
1447
|
+
{
|
|
1448
|
+
match self {
|
|
1449
|
+
Ok(_) => res,
|
|
1450
|
+
Err(e) => Err(e),
|
|
1451
|
+
}
|
|
1452
|
+
}
|
|
1453
|
+
|
|
1454
|
+
/// Calls `op` if the result is [`Ok`], otherwise returns the [`Err`] value of `self`.
|
|
1455
|
+
///
|
|
1456
|
+
///
|
|
1457
|
+
/// This function can be used for control flow based on `Result` values.
|
|
1458
|
+
///
|
|
1459
|
+
/// # Examples
|
|
1460
|
+
///
|
|
1461
|
+
/// ```
|
|
1462
|
+
/// fn sq_then_to_string(x: u32) -> Result<String, &'static str> {
|
|
1463
|
+
/// x.checked_mul(x).map(|sq| sq.to_string()).ok_or("overflowed")
|
|
1464
|
+
/// }
|
|
1465
|
+
///
|
|
1466
|
+
/// assert_eq!(Ok(2).and_then(sq_then_to_string), Ok(4.to_string()));
|
|
1467
|
+
/// assert_eq!(Ok(1_000_000).and_then(sq_then_to_string), Err("overflowed"));
|
|
1468
|
+
/// assert_eq!(Err("not a number").and_then(sq_then_to_string), Err("not a number"));
|
|
1469
|
+
/// ```
|
|
1470
|
+
///
|
|
1471
|
+
/// Often used to chain fallible operations that may return [`Err`].
|
|
1472
|
+
///
|
|
1473
|
+
/// ```
|
|
1474
|
+
/// use std::{io::ErrorKind, path::Path};
|
|
1475
|
+
///
|
|
1476
|
+
/// // Note: on Windows "/" maps to "C:\"
|
|
1477
|
+
/// let root_modified_time = Path::new("/").metadata().and_then(|md| md.modified());
|
|
1478
|
+
/// assert!(root_modified_time.is_ok());
|
|
1479
|
+
///
|
|
1480
|
+
/// let should_fail = Path::new("/bad/path").metadata().and_then(|md| md.modified());
|
|
1481
|
+
/// assert!(should_fail.is_err());
|
|
1482
|
+
/// assert_eq!(should_fail.unwrap_err().kind(), ErrorKind::NotFound);
|
|
1483
|
+
/// ```
|
|
1484
|
+
#[inline]
|
|
1485
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
1486
|
+
#[rustc_const_unstable(feature = "const_result_trait_fn", issue = "144211")]
|
|
1487
|
+
#[rustc_confusables("flat_map", "flatmap")]
|
|
1488
|
+
pub const fn and_then<U, F>(self, op: F) -> Result<U, E>
|
|
1489
|
+
where
|
|
1490
|
+
F: [const] FnOnce(T) -> Result<U, E> + [const] Destruct,
|
|
1491
|
+
{
|
|
1492
|
+
match self {
|
|
1493
|
+
Ok(t) => op(t),
|
|
1494
|
+
Err(e) => Err(e),
|
|
1495
|
+
}
|
|
1496
|
+
}
|
|
1497
|
+
|
|
1498
|
+
/// Returns `res` if the result is [`Err`], otherwise returns the [`Ok`] value of `self`.
|
|
1499
|
+
///
|
|
1500
|
+
/// Arguments passed to `or` are eagerly evaluated; if you are passing the
|
|
1501
|
+
/// result of a function call, it is recommended to use [`or_else`], which is
|
|
1502
|
+
/// lazily evaluated.
|
|
1503
|
+
///
|
|
1504
|
+
/// [`or_else`]: Result::or_else
|
|
1505
|
+
///
|
|
1506
|
+
/// # Examples
|
|
1507
|
+
///
|
|
1508
|
+
/// ```
|
|
1509
|
+
/// let x: Result<u32, &str> = Ok(2);
|
|
1510
|
+
/// let y: Result<u32, &str> = Err("late error");
|
|
1511
|
+
/// assert_eq!(x.or(y), Ok(2));
|
|
1512
|
+
///
|
|
1513
|
+
/// let x: Result<u32, &str> = Err("early error");
|
|
1514
|
+
/// let y: Result<u32, &str> = Ok(2);
|
|
1515
|
+
/// assert_eq!(x.or(y), Ok(2));
|
|
1516
|
+
///
|
|
1517
|
+
/// let x: Result<u32, &str> = Err("not a 2");
|
|
1518
|
+
/// let y: Result<u32, &str> = Err("late error");
|
|
1519
|
+
/// assert_eq!(x.or(y), Err("late error"));
|
|
1520
|
+
///
|
|
1521
|
+
/// let x: Result<u32, &str> = Ok(2);
|
|
1522
|
+
/// let y: Result<u32, &str> = Ok(100);
|
|
1523
|
+
/// assert_eq!(x.or(y), Ok(2));
|
|
1524
|
+
/// ```
|
|
1525
|
+
#[inline]
|
|
1526
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
1527
|
+
#[rustc_const_unstable(feature = "const_result_trait_fn", issue = "144211")]
|
|
1528
|
+
pub const fn or<F>(self, res: Result<T, F>) -> Result<T, F>
|
|
1529
|
+
where
|
|
1530
|
+
T: [const] Destruct,
|
|
1531
|
+
E: [const] Destruct,
|
|
1532
|
+
F: [const] Destruct,
|
|
1533
|
+
{
|
|
1534
|
+
match self {
|
|
1535
|
+
Ok(v) => Ok(v),
|
|
1536
|
+
Err(_) => res,
|
|
1537
|
+
}
|
|
1538
|
+
}
|
|
1539
|
+
|
|
1540
|
+
/// Calls `op` if the result is [`Err`], otherwise returns the [`Ok`] value of `self`.
|
|
1541
|
+
///
|
|
1542
|
+
/// This function can be used for control flow based on result values.
|
|
1543
|
+
///
|
|
1544
|
+
///
|
|
1545
|
+
/// # Examples
|
|
1546
|
+
///
|
|
1547
|
+
/// ```
|
|
1548
|
+
/// fn sq(x: u32) -> Result<u32, u32> { Ok(x * x) }
|
|
1549
|
+
/// fn err(x: u32) -> Result<u32, u32> { Err(x) }
|
|
1550
|
+
///
|
|
1551
|
+
/// assert_eq!(Ok(2).or_else(sq).or_else(sq), Ok(2));
|
|
1552
|
+
/// assert_eq!(Ok(2).or_else(err).or_else(sq), Ok(2));
|
|
1553
|
+
/// assert_eq!(Err(3).or_else(sq).or_else(err), Ok(9));
|
|
1554
|
+
/// assert_eq!(Err(3).or_else(err).or_else(err), Err(3));
|
|
1555
|
+
/// ```
|
|
1556
|
+
#[inline]
|
|
1557
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
1558
|
+
#[rustc_const_unstable(feature = "const_result_trait_fn", issue = "144211")]
|
|
1559
|
+
pub const fn or_else<F, O>(self, op: O) -> Result<T, F>
|
|
1560
|
+
where
|
|
1561
|
+
O: [const] FnOnce(E) -> Result<T, F> + [const] Destruct,
|
|
1562
|
+
{
|
|
1563
|
+
match self {
|
|
1564
|
+
Ok(t) => Ok(t),
|
|
1565
|
+
Err(e) => op(e),
|
|
1566
|
+
}
|
|
1567
|
+
}
|
|
1568
|
+
|
|
1569
|
+
/// Returns the contained [`Ok`] value or a provided default.
|
|
1570
|
+
///
|
|
1571
|
+
/// Arguments passed to `unwrap_or` are eagerly evaluated; if you are passing
|
|
1572
|
+
/// the result of a function call, it is recommended to use [`unwrap_or_else`],
|
|
1573
|
+
/// which is lazily evaluated.
|
|
1574
|
+
///
|
|
1575
|
+
/// [`unwrap_or_else`]: Result::unwrap_or_else
|
|
1576
|
+
///
|
|
1577
|
+
/// # Examples
|
|
1578
|
+
///
|
|
1579
|
+
/// ```
|
|
1580
|
+
/// let default = 2;
|
|
1581
|
+
/// let x: Result<u32, &str> = Ok(9);
|
|
1582
|
+
/// assert_eq!(x.unwrap_or(default), 9);
|
|
1583
|
+
///
|
|
1584
|
+
/// let x: Result<u32, &str> = Err("error");
|
|
1585
|
+
/// assert_eq!(x.unwrap_or(default), default);
|
|
1586
|
+
/// ```
|
|
1587
|
+
#[inline]
|
|
1588
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
1589
|
+
#[rustc_const_unstable(feature = "const_result_trait_fn", issue = "144211")]
|
|
1590
|
+
pub const fn unwrap_or(self, default: T) -> T
|
|
1591
|
+
where
|
|
1592
|
+
T: [const] Destruct,
|
|
1593
|
+
E: [const] Destruct,
|
|
1594
|
+
{
|
|
1595
|
+
match self {
|
|
1596
|
+
Ok(t) => t,
|
|
1597
|
+
Err(_) => default,
|
|
1598
|
+
}
|
|
1599
|
+
}
|
|
1600
|
+
|
|
1601
|
+
/// Returns the contained [`Ok`] value or computes it from a closure.
|
|
1602
|
+
///
|
|
1603
|
+
///
|
|
1604
|
+
/// # Examples
|
|
1605
|
+
///
|
|
1606
|
+
/// ```
|
|
1607
|
+
/// fn count(x: &str) -> usize { x.len() }
|
|
1608
|
+
///
|
|
1609
|
+
/// assert_eq!(Ok(2).unwrap_or_else(count), 2);
|
|
1610
|
+
/// assert_eq!(Err("foo").unwrap_or_else(count), 3);
|
|
1611
|
+
/// ```
|
|
1612
|
+
#[inline]
|
|
1613
|
+
#[track_caller]
|
|
1614
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
1615
|
+
#[rustc_const_unstable(feature = "const_result_trait_fn", issue = "144211")]
|
|
1616
|
+
pub const fn unwrap_or_else<F>(self, op: F) -> T
|
|
1617
|
+
where
|
|
1618
|
+
F: [const] FnOnce(E) -> T + [const] Destruct,
|
|
1619
|
+
{
|
|
1620
|
+
match self {
|
|
1621
|
+
Ok(t) => t,
|
|
1622
|
+
Err(e) => op(e),
|
|
1623
|
+
}
|
|
1624
|
+
}
|
|
1625
|
+
|
|
1626
|
+
/// Returns the contained [`Ok`] value, consuming the `self` value,
|
|
1627
|
+
/// without checking that the value is not an [`Err`].
|
|
1628
|
+
///
|
|
1629
|
+
/// # Safety
|
|
1630
|
+
///
|
|
1631
|
+
/// Calling this method on an [`Err`] is *[undefined behavior]*.
|
|
1632
|
+
///
|
|
1633
|
+
/// [undefined behavior]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html
|
|
1634
|
+
///
|
|
1635
|
+
/// # Examples
|
|
1636
|
+
///
|
|
1637
|
+
/// ```
|
|
1638
|
+
/// let x: Result<u32, &str> = Ok(2);
|
|
1639
|
+
/// assert_eq!(unsafe { x.unwrap_unchecked() }, 2);
|
|
1640
|
+
/// ```
|
|
1641
|
+
///
|
|
1642
|
+
/// ```no_run
|
|
1643
|
+
/// let x: Result<u32, &str> = Err("emergency failure");
|
|
1644
|
+
/// unsafe { x.unwrap_unchecked() }; // Undefined behavior!
|
|
1645
|
+
/// ```
|
|
1646
|
+
#[inline]
|
|
1647
|
+
#[track_caller]
|
|
1648
|
+
#[stable(feature = "option_result_unwrap_unchecked", since = "1.58.0")]
|
|
1649
|
+
#[rustc_const_unstable(feature = "const_result_unwrap_unchecked", issue = "148714")]
|
|
1650
|
+
pub const unsafe fn unwrap_unchecked(self) -> T {
|
|
1651
|
+
match self {
|
|
1652
|
+
Ok(t) => t,
|
|
1653
|
+
Err(e) => {
|
|
1654
|
+
// FIXME(const-hack): to avoid E: const Destruct bound
|
|
1655
|
+
super::mem::forget(e);
|
|
1656
|
+
// SAFETY: the safety contract must be upheld by the caller.
|
|
1657
|
+
unsafe { hint::unreachable_unchecked() }
|
|
1658
|
+
}
|
|
1659
|
+
}
|
|
1660
|
+
}
|
|
1661
|
+
|
|
1662
|
+
/// Returns the contained [`Err`] value, consuming the `self` value,
|
|
1663
|
+
/// without checking that the value is not an [`Ok`].
|
|
1664
|
+
///
|
|
1665
|
+
/// # Safety
|
|
1666
|
+
///
|
|
1667
|
+
/// Calling this method on an [`Ok`] is *[undefined behavior]*.
|
|
1668
|
+
///
|
|
1669
|
+
/// [undefined behavior]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html
|
|
1670
|
+
///
|
|
1671
|
+
/// # Examples
|
|
1672
|
+
///
|
|
1673
|
+
/// ```no_run
|
|
1674
|
+
/// let x: Result<u32, &str> = Ok(2);
|
|
1675
|
+
/// unsafe { x.unwrap_err_unchecked() }; // Undefined behavior!
|
|
1676
|
+
/// ```
|
|
1677
|
+
///
|
|
1678
|
+
/// ```
|
|
1679
|
+
/// let x: Result<u32, &str> = Err("emergency failure");
|
|
1680
|
+
/// assert_eq!(unsafe { x.unwrap_err_unchecked() }, "emergency failure");
|
|
1681
|
+
/// ```
|
|
1682
|
+
#[inline]
|
|
1683
|
+
#[track_caller]
|
|
1684
|
+
#[stable(feature = "option_result_unwrap_unchecked", since = "1.58.0")]
|
|
1685
|
+
pub unsafe fn unwrap_err_unchecked(self) -> E {
|
|
1686
|
+
match self {
|
|
1687
|
+
// SAFETY: the safety contract must be upheld by the caller.
|
|
1688
|
+
Ok(_) => unsafe { hint::unreachable_unchecked() },
|
|
1689
|
+
Err(e) => e,
|
|
1690
|
+
}
|
|
1691
|
+
}
|
|
1692
|
+
}
|
|
1693
|
+
|
|
1694
|
+
impl<T, E> Result<&T, E> {
|
|
1695
|
+
/// Maps a `Result<&T, E>` to a `Result<T, E>` by copying the contents of the
|
|
1696
|
+
/// `Ok` part.
|
|
1697
|
+
///
|
|
1698
|
+
/// # Examples
|
|
1699
|
+
///
|
|
1700
|
+
/// ```
|
|
1701
|
+
/// let val = 12;
|
|
1702
|
+
/// let x: Result<&i32, i32> = Ok(&val);
|
|
1703
|
+
/// assert_eq!(x, Ok(&12));
|
|
1704
|
+
/// let copied = x.copied();
|
|
1705
|
+
/// assert_eq!(copied, Ok(12));
|
|
1706
|
+
/// ```
|
|
1707
|
+
#[inline]
|
|
1708
|
+
#[stable(feature = "result_copied", since = "1.59.0")]
|
|
1709
|
+
#[rustc_const_stable(feature = "const_result", since = "1.83.0")]
|
|
1710
|
+
#[rustc_allow_const_fn_unstable(const_precise_live_drops)]
|
|
1711
|
+
pub const fn copied(self) -> Result<T, E>
|
|
1712
|
+
where
|
|
1713
|
+
T: Copy,
|
|
1714
|
+
{
|
|
1715
|
+
// FIXME(const-hack): this implementation, which sidesteps using `Result::map` since it's not const
|
|
1716
|
+
// ready yet, should be reverted when possible to avoid code repetition
|
|
1717
|
+
match self {
|
|
1718
|
+
Ok(&v) => Ok(v),
|
|
1719
|
+
Err(e) => Err(e),
|
|
1720
|
+
}
|
|
1721
|
+
}
|
|
1722
|
+
|
|
1723
|
+
/// Maps a `Result<&T, E>` to a `Result<T, E>` by cloning the contents of the
|
|
1724
|
+
/// `Ok` part.
|
|
1725
|
+
///
|
|
1726
|
+
/// # Examples
|
|
1727
|
+
///
|
|
1728
|
+
/// ```
|
|
1729
|
+
/// let val = 12;
|
|
1730
|
+
/// let x: Result<&i32, i32> = Ok(&val);
|
|
1731
|
+
/// assert_eq!(x, Ok(&12));
|
|
1732
|
+
/// let cloned = x.cloned();
|
|
1733
|
+
/// assert_eq!(cloned, Ok(12));
|
|
1734
|
+
/// ```
|
|
1735
|
+
#[inline]
|
|
1736
|
+
#[stable(feature = "result_cloned", since = "1.59.0")]
|
|
1737
|
+
pub fn cloned(self) -> Result<T, E>
|
|
1738
|
+
where
|
|
1739
|
+
T: Clone,
|
|
1740
|
+
{
|
|
1741
|
+
self.map(|t| t.clone())
|
|
1742
|
+
}
|
|
1743
|
+
}
|
|
1744
|
+
|
|
1745
|
+
impl<T, E> Result<&mut T, E> {
|
|
1746
|
+
/// Maps a `Result<&mut T, E>` to a `Result<T, E>` by copying the contents of the
|
|
1747
|
+
/// `Ok` part.
|
|
1748
|
+
///
|
|
1749
|
+
/// # Examples
|
|
1750
|
+
///
|
|
1751
|
+
/// ```
|
|
1752
|
+
/// let mut val = 12;
|
|
1753
|
+
/// let x: Result<&mut i32, i32> = Ok(&mut val);
|
|
1754
|
+
/// assert_eq!(x, Ok(&mut 12));
|
|
1755
|
+
/// let copied = x.copied();
|
|
1756
|
+
/// assert_eq!(copied, Ok(12));
|
|
1757
|
+
/// ```
|
|
1758
|
+
#[inline]
|
|
1759
|
+
#[stable(feature = "result_copied", since = "1.59.0")]
|
|
1760
|
+
#[rustc_const_stable(feature = "const_result", since = "1.83.0")]
|
|
1761
|
+
#[rustc_allow_const_fn_unstable(const_precise_live_drops)]
|
|
1762
|
+
pub const fn copied(self) -> Result<T, E>
|
|
1763
|
+
where
|
|
1764
|
+
T: Copy,
|
|
1765
|
+
{
|
|
1766
|
+
// FIXME(const-hack): this implementation, which sidesteps using `Result::map` since it's not const
|
|
1767
|
+
// ready yet, should be reverted when possible to avoid code repetition
|
|
1768
|
+
match self {
|
|
1769
|
+
Ok(&mut v) => Ok(v),
|
|
1770
|
+
Err(e) => Err(e),
|
|
1771
|
+
}
|
|
1772
|
+
}
|
|
1773
|
+
|
|
1774
|
+
/// Maps a `Result<&mut T, E>` to a `Result<T, E>` by cloning the contents of the
|
|
1775
|
+
/// `Ok` part.
|
|
1776
|
+
///
|
|
1777
|
+
/// # Examples
|
|
1778
|
+
///
|
|
1779
|
+
/// ```
|
|
1780
|
+
/// let mut val = 12;
|
|
1781
|
+
/// let x: Result<&mut i32, i32> = Ok(&mut val);
|
|
1782
|
+
/// assert_eq!(x, Ok(&mut 12));
|
|
1783
|
+
/// let cloned = x.cloned();
|
|
1784
|
+
/// assert_eq!(cloned, Ok(12));
|
|
1785
|
+
/// ```
|
|
1786
|
+
#[inline]
|
|
1787
|
+
#[stable(feature = "result_cloned", since = "1.59.0")]
|
|
1788
|
+
pub fn cloned(self) -> Result<T, E>
|
|
1789
|
+
where
|
|
1790
|
+
T: Clone,
|
|
1791
|
+
{
|
|
1792
|
+
self.map(|t| t.clone())
|
|
1793
|
+
}
|
|
1794
|
+
}
|
|
1795
|
+
|
|
1796
|
+
impl<T, E> Result<Option<T>, E> {
|
|
1797
|
+
/// Transposes a `Result` of an `Option` into an `Option` of a `Result`.
|
|
1798
|
+
///
|
|
1799
|
+
/// `Ok(None)` will be mapped to `None`.
|
|
1800
|
+
/// `Ok(Some(_))` and `Err(_)` will be mapped to `Some(Ok(_))` and `Some(Err(_))`.
|
|
1801
|
+
///
|
|
1802
|
+
/// # Examples
|
|
1803
|
+
///
|
|
1804
|
+
/// ```
|
|
1805
|
+
/// #[derive(Debug, Eq, PartialEq)]
|
|
1806
|
+
/// struct SomeErr;
|
|
1807
|
+
///
|
|
1808
|
+
/// let x: Result<Option<i32>, SomeErr> = Ok(Some(5));
|
|
1809
|
+
/// let y: Option<Result<i32, SomeErr>> = Some(Ok(5));
|
|
1810
|
+
/// assert_eq!(x.transpose(), y);
|
|
1811
|
+
/// ```
|
|
1812
|
+
#[inline]
|
|
1813
|
+
#[stable(feature = "transpose_result", since = "1.33.0")]
|
|
1814
|
+
#[rustc_const_stable(feature = "const_result", since = "1.83.0")]
|
|
1815
|
+
#[rustc_allow_const_fn_unstable(const_precise_live_drops)]
|
|
1816
|
+
pub const fn transpose(self) -> Option<Result<T, E>> {
|
|
1817
|
+
match self {
|
|
1818
|
+
Ok(Some(x)) => Some(Ok(x)),
|
|
1819
|
+
Ok(None) => None,
|
|
1820
|
+
Err(e) => Some(Err(e)),
|
|
1821
|
+
}
|
|
1822
|
+
}
|
|
1823
|
+
}
|
|
1824
|
+
|
|
1825
|
+
impl<T, E> Result<Result<T, E>, E> {
|
|
1826
|
+
/// Converts from `Result<Result<T, E>, E>` to `Result<T, E>`
|
|
1827
|
+
///
|
|
1828
|
+
/// # Examples
|
|
1829
|
+
///
|
|
1830
|
+
/// ```
|
|
1831
|
+
/// let x: Result<Result<&'static str, u32>, u32> = Ok(Ok("hello"));
|
|
1832
|
+
/// assert_eq!(Ok("hello"), x.flatten());
|
|
1833
|
+
///
|
|
1834
|
+
/// let x: Result<Result<&'static str, u32>, u32> = Ok(Err(6));
|
|
1835
|
+
/// assert_eq!(Err(6), x.flatten());
|
|
1836
|
+
///
|
|
1837
|
+
/// let x: Result<Result<&'static str, u32>, u32> = Err(6);
|
|
1838
|
+
/// assert_eq!(Err(6), x.flatten());
|
|
1839
|
+
/// ```
|
|
1840
|
+
///
|
|
1841
|
+
/// Flattening only removes one level of nesting at a time:
|
|
1842
|
+
///
|
|
1843
|
+
/// ```
|
|
1844
|
+
/// let x: Result<Result<Result<&'static str, u32>, u32>, u32> = Ok(Ok(Ok("hello")));
|
|
1845
|
+
/// assert_eq!(Ok(Ok("hello")), x.flatten());
|
|
1846
|
+
/// assert_eq!(Ok("hello"), x.flatten().flatten());
|
|
1847
|
+
/// ```
|
|
1848
|
+
#[inline]
|
|
1849
|
+
#[stable(feature = "result_flattening", since = "1.89.0")]
|
|
1850
|
+
#[rustc_allow_const_fn_unstable(const_precise_live_drops)]
|
|
1851
|
+
#[rustc_const_stable(feature = "result_flattening", since = "1.89.0")]
|
|
1852
|
+
pub const fn flatten(self) -> Result<T, E> {
|
|
1853
|
+
// FIXME(const-hack): could be written with `and_then`
|
|
1854
|
+
match self {
|
|
1855
|
+
Ok(inner) => inner,
|
|
1856
|
+
Err(e) => Err(e),
|
|
1857
|
+
}
|
|
1858
|
+
}
|
|
1859
|
+
}
|
|
1860
|
+
|
|
1861
|
+
// This is a separate function to reduce the code size of the methods
|
|
1862
|
+
#[cfg(not(panic = "immediate-abort"))]
|
|
1863
|
+
#[inline(never)]
|
|
1864
|
+
#[cold]
|
|
1865
|
+
#[track_caller]
|
|
1866
|
+
fn unwrap_failed(msg: &str, error: &dyn fmt::Debug) -> ! {
|
|
1867
|
+
panic!("{msg}: {error:?}");
|
|
1868
|
+
}
|
|
1869
|
+
|
|
1870
|
+
// This is a separate function to avoid constructing a `dyn Debug`
|
|
1871
|
+
// that gets immediately thrown away, since vtables don't get cleaned up
|
|
1872
|
+
// by dead code elimination if a trait object is constructed even if it goes
|
|
1873
|
+
// unused
|
|
1874
|
+
#[cfg(panic = "immediate-abort")]
|
|
1875
|
+
#[inline]
|
|
1876
|
+
#[cold]
|
|
1877
|
+
#[track_caller]
|
|
1878
|
+
const fn unwrap_failed<T>(_msg: &str, _error: &T) -> ! {
|
|
1879
|
+
panic!()
|
|
1880
|
+
}
|
|
1881
|
+
|
|
1882
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
1883
|
+
// Trait implementations
|
|
1884
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
1885
|
+
|
|
1886
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
1887
|
+
impl<T, E> Clone for Result<T, E>
|
|
1888
|
+
where
|
|
1889
|
+
T: Clone,
|
|
1890
|
+
E: Clone,
|
|
1891
|
+
{
|
|
1892
|
+
#[inline]
|
|
1893
|
+
fn clone(&self) -> Self {
|
|
1894
|
+
match self {
|
|
1895
|
+
Ok(x) => Ok(x.clone()),
|
|
1896
|
+
Err(x) => Err(x.clone()),
|
|
1897
|
+
}
|
|
1898
|
+
}
|
|
1899
|
+
|
|
1900
|
+
#[inline]
|
|
1901
|
+
fn clone_from(&mut self, source: &Self) {
|
|
1902
|
+
match (self, source) {
|
|
1903
|
+
(Ok(to), Ok(from)) => to.clone_from(from),
|
|
1904
|
+
(Err(to), Err(from)) => to.clone_from(from),
|
|
1905
|
+
(to, from) => *to = from.clone(),
|
|
1906
|
+
}
|
|
1907
|
+
}
|
|
1908
|
+
}
|
|
1909
|
+
|
|
1910
|
+
#[unstable(feature = "ergonomic_clones", issue = "132290")]
|
|
1911
|
+
impl<T, E> crate::clone::UseCloned for Result<T, E>
|
|
1912
|
+
where
|
|
1913
|
+
T: crate::clone::UseCloned,
|
|
1914
|
+
E: crate::clone::UseCloned,
|
|
1915
|
+
{
|
|
1916
|
+
}
|
|
1917
|
+
|
|
1918
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
1919
|
+
impl<T, E> IntoIterator for Result<T, E> {
|
|
1920
|
+
type Item = T;
|
|
1921
|
+
type IntoIter = IntoIter<T>;
|
|
1922
|
+
|
|
1923
|
+
/// Returns a consuming iterator over the possibly contained value.
|
|
1924
|
+
///
|
|
1925
|
+
/// The iterator yields one value if the result is [`Result::Ok`], otherwise none.
|
|
1926
|
+
///
|
|
1927
|
+
/// # Examples
|
|
1928
|
+
///
|
|
1929
|
+
/// ```
|
|
1930
|
+
/// let x: Result<u32, &str> = Ok(5);
|
|
1931
|
+
/// let v: Vec<u32> = x.into_iter().collect();
|
|
1932
|
+
/// assert_eq!(v, [5]);
|
|
1933
|
+
///
|
|
1934
|
+
/// let x: Result<u32, &str> = Err("nothing!");
|
|
1935
|
+
/// let v: Vec<u32> = x.into_iter().collect();
|
|
1936
|
+
/// assert_eq!(v, []);
|
|
1937
|
+
/// ```
|
|
1938
|
+
#[inline]
|
|
1939
|
+
fn into_iter(self) -> IntoIter<T> {
|
|
1940
|
+
IntoIter { inner: self.ok() }
|
|
1941
|
+
}
|
|
1942
|
+
}
|
|
1943
|
+
|
|
1944
|
+
#[stable(since = "1.4.0", feature = "result_iter")]
|
|
1945
|
+
impl<'a, T, E> IntoIterator for &'a Result<T, E> {
|
|
1946
|
+
type Item = &'a T;
|
|
1947
|
+
type IntoIter = Iter<'a, T>;
|
|
1948
|
+
|
|
1949
|
+
fn into_iter(self) -> Iter<'a, T> {
|
|
1950
|
+
self.iter()
|
|
1951
|
+
}
|
|
1952
|
+
}
|
|
1953
|
+
|
|
1954
|
+
#[stable(since = "1.4.0", feature = "result_iter")]
|
|
1955
|
+
impl<'a, T, E> IntoIterator for &'a mut Result<T, E> {
|
|
1956
|
+
type Item = &'a mut T;
|
|
1957
|
+
type IntoIter = IterMut<'a, T>;
|
|
1958
|
+
|
|
1959
|
+
fn into_iter(self) -> IterMut<'a, T> {
|
|
1960
|
+
self.iter_mut()
|
|
1961
|
+
}
|
|
1962
|
+
}
|
|
1963
|
+
|
|
1964
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
1965
|
+
// The Result Iterators
|
|
1966
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
1967
|
+
|
|
1968
|
+
/// An iterator over a reference to the [`Ok`] variant of a [`Result`].
|
|
1969
|
+
///
|
|
1970
|
+
/// The iterator yields one value if the result is [`Ok`], otherwise none.
|
|
1971
|
+
///
|
|
1972
|
+
/// Created by [`Result::iter`].
|
|
1973
|
+
#[derive(Debug)]
|
|
1974
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
1975
|
+
pub struct Iter<'a, T: 'a> {
|
|
1976
|
+
inner: Option<&'a T>,
|
|
1977
|
+
}
|
|
1978
|
+
|
|
1979
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
1980
|
+
impl<'a, T> Iterator for Iter<'a, T> {
|
|
1981
|
+
type Item = &'a T;
|
|
1982
|
+
|
|
1983
|
+
#[inline]
|
|
1984
|
+
fn next(&mut self) -> Option<&'a T> {
|
|
1985
|
+
self.inner.take()
|
|
1986
|
+
}
|
|
1987
|
+
#[inline]
|
|
1988
|
+
fn size_hint(&self) -> (usize, Option<usize>) {
|
|
1989
|
+
let n = if self.inner.is_some() { 1 } else { 0 };
|
|
1990
|
+
(n, Some(n))
|
|
1991
|
+
}
|
|
1992
|
+
}
|
|
1993
|
+
|
|
1994
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
1995
|
+
impl<'a, T> DoubleEndedIterator for Iter<'a, T> {
|
|
1996
|
+
#[inline]
|
|
1997
|
+
fn next_back(&mut self) -> Option<&'a T> {
|
|
1998
|
+
self.inner.take()
|
|
1999
|
+
}
|
|
2000
|
+
}
|
|
2001
|
+
|
|
2002
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
2003
|
+
impl<T> ExactSizeIterator for Iter<'_, T> {}
|
|
2004
|
+
|
|
2005
|
+
#[stable(feature = "fused", since = "1.26.0")]
|
|
2006
|
+
impl<T> FusedIterator for Iter<'_, T> {}
|
|
2007
|
+
|
|
2008
|
+
#[unstable(feature = "trusted_len", issue = "37572")]
|
|
2009
|
+
unsafe impl<A> TrustedLen for Iter<'_, A> {}
|
|
2010
|
+
|
|
2011
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
2012
|
+
impl<T> Clone for Iter<'_, T> {
|
|
2013
|
+
#[inline]
|
|
2014
|
+
fn clone(&self) -> Self {
|
|
2015
|
+
Iter { inner: self.inner }
|
|
2016
|
+
}
|
|
2017
|
+
}
|
|
2018
|
+
|
|
2019
|
+
/// An iterator over a mutable reference to the [`Ok`] variant of a [`Result`].
|
|
2020
|
+
///
|
|
2021
|
+
/// Created by [`Result::iter_mut`].
|
|
2022
|
+
#[derive(Debug)]
|
|
2023
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
2024
|
+
pub struct IterMut<'a, T: 'a> {
|
|
2025
|
+
inner: Option<&'a mut T>,
|
|
2026
|
+
}
|
|
2027
|
+
|
|
2028
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
2029
|
+
impl<'a, T> Iterator for IterMut<'a, T> {
|
|
2030
|
+
type Item = &'a mut T;
|
|
2031
|
+
|
|
2032
|
+
#[inline]
|
|
2033
|
+
fn next(&mut self) -> Option<&'a mut T> {
|
|
2034
|
+
self.inner.take()
|
|
2035
|
+
}
|
|
2036
|
+
#[inline]
|
|
2037
|
+
fn size_hint(&self) -> (usize, Option<usize>) {
|
|
2038
|
+
let n = if self.inner.is_some() { 1 } else { 0 };
|
|
2039
|
+
(n, Some(n))
|
|
2040
|
+
}
|
|
2041
|
+
}
|
|
2042
|
+
|
|
2043
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
2044
|
+
impl<'a, T> DoubleEndedIterator for IterMut<'a, T> {
|
|
2045
|
+
#[inline]
|
|
2046
|
+
fn next_back(&mut self) -> Option<&'a mut T> {
|
|
2047
|
+
self.inner.take()
|
|
2048
|
+
}
|
|
2049
|
+
}
|
|
2050
|
+
|
|
2051
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
2052
|
+
impl<T> ExactSizeIterator for IterMut<'_, T> {}
|
|
2053
|
+
|
|
2054
|
+
#[stable(feature = "fused", since = "1.26.0")]
|
|
2055
|
+
impl<T> FusedIterator for IterMut<'_, T> {}
|
|
2056
|
+
|
|
2057
|
+
#[unstable(feature = "trusted_len", issue = "37572")]
|
|
2058
|
+
unsafe impl<A> TrustedLen for IterMut<'_, A> {}
|
|
2059
|
+
|
|
2060
|
+
/// An iterator over the value in a [`Ok`] variant of a [`Result`].
|
|
2061
|
+
///
|
|
2062
|
+
/// The iterator yields one value if the result is [`Ok`], otherwise none.
|
|
2063
|
+
///
|
|
2064
|
+
/// This struct is created by the [`into_iter`] method on
|
|
2065
|
+
/// [`Result`] (provided by the [`IntoIterator`] trait).
|
|
2066
|
+
///
|
|
2067
|
+
/// [`into_iter`]: IntoIterator::into_iter
|
|
2068
|
+
#[derive(Clone, Debug)]
|
|
2069
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
2070
|
+
pub struct IntoIter<T> {
|
|
2071
|
+
inner: Option<T>,
|
|
2072
|
+
}
|
|
2073
|
+
|
|
2074
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
2075
|
+
impl<T> Iterator for IntoIter<T> {
|
|
2076
|
+
type Item = T;
|
|
2077
|
+
|
|
2078
|
+
#[inline]
|
|
2079
|
+
fn next(&mut self) -> Option<T> {
|
|
2080
|
+
self.inner.take()
|
|
2081
|
+
}
|
|
2082
|
+
#[inline]
|
|
2083
|
+
fn size_hint(&self) -> (usize, Option<usize>) {
|
|
2084
|
+
let n = if self.inner.is_some() { 1 } else { 0 };
|
|
2085
|
+
(n, Some(n))
|
|
2086
|
+
}
|
|
2087
|
+
}
|
|
2088
|
+
|
|
2089
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
2090
|
+
impl<T> DoubleEndedIterator for IntoIter<T> {
|
|
2091
|
+
#[inline]
|
|
2092
|
+
fn next_back(&mut self) -> Option<T> {
|
|
2093
|
+
self.inner.take()
|
|
2094
|
+
}
|
|
2095
|
+
}
|
|
2096
|
+
|
|
2097
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
2098
|
+
impl<T> ExactSizeIterator for IntoIter<T> {}
|
|
2099
|
+
|
|
2100
|
+
#[stable(feature = "fused", since = "1.26.0")]
|
|
2101
|
+
impl<T> FusedIterator for IntoIter<T> {}
|
|
2102
|
+
|
|
2103
|
+
#[unstable(feature = "trusted_len", issue = "37572")]
|
|
2104
|
+
unsafe impl<A> TrustedLen for IntoIter<A> {}
|
|
2105
|
+
|
|
2106
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
2107
|
+
// FromIterator
|
|
2108
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
2109
|
+
|
|
2110
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
2111
|
+
impl<A, E, V: FromIterator<A>> FromIterator<Result<A, E>> for Result<V, E> {
|
|
2112
|
+
/// Takes each element in the `Iterator`: if it is an `Err`, no further
|
|
2113
|
+
/// elements are taken, and the `Err` is returned. Should no `Err` occur, a
|
|
2114
|
+
/// container with the values of each `Result` is returned.
|
|
2115
|
+
///
|
|
2116
|
+
/// Here is an example which increments every integer in a vector,
|
|
2117
|
+
/// checking for overflow:
|
|
2118
|
+
///
|
|
2119
|
+
/// ```
|
|
2120
|
+
/// let v = vec![1, 2];
|
|
2121
|
+
/// let res: Result<Vec<u32>, &'static str> = v.iter().map(|x: &u32|
|
|
2122
|
+
/// x.checked_add(1).ok_or("Overflow!")
|
|
2123
|
+
/// ).collect();
|
|
2124
|
+
/// assert_eq!(res, Ok(vec![2, 3]));
|
|
2125
|
+
/// ```
|
|
2126
|
+
///
|
|
2127
|
+
/// Here is another example that tries to subtract one from another list
|
|
2128
|
+
/// of integers, this time checking for underflow:
|
|
2129
|
+
///
|
|
2130
|
+
/// ```
|
|
2131
|
+
/// let v = vec![1, 2, 0];
|
|
2132
|
+
/// let res: Result<Vec<u32>, &'static str> = v.iter().map(|x: &u32|
|
|
2133
|
+
/// x.checked_sub(1).ok_or("Underflow!")
|
|
2134
|
+
/// ).collect();
|
|
2135
|
+
/// assert_eq!(res, Err("Underflow!"));
|
|
2136
|
+
/// ```
|
|
2137
|
+
///
|
|
2138
|
+
/// Here is a variation on the previous example, showing that no
|
|
2139
|
+
/// further elements are taken from `iter` after the first `Err`.
|
|
2140
|
+
///
|
|
2141
|
+
/// ```
|
|
2142
|
+
/// let v = vec![3, 2, 1, 10];
|
|
2143
|
+
/// let mut shared = 0;
|
|
2144
|
+
/// let res: Result<Vec<u32>, &'static str> = v.iter().map(|x: &u32| {
|
|
2145
|
+
/// shared += x;
|
|
2146
|
+
/// x.checked_sub(2).ok_or("Underflow!")
|
|
2147
|
+
/// }).collect();
|
|
2148
|
+
/// assert_eq!(res, Err("Underflow!"));
|
|
2149
|
+
/// assert_eq!(shared, 6);
|
|
2150
|
+
/// ```
|
|
2151
|
+
///
|
|
2152
|
+
/// Since the third element caused an underflow, no further elements were taken,
|
|
2153
|
+
/// so the final value of `shared` is 6 (= `3 + 2 + 1`), not 16.
|
|
2154
|
+
#[inline]
|
|
2155
|
+
fn from_iter<I: IntoIterator<Item = Result<A, E>>>(iter: I) -> Result<V, E> {
|
|
2156
|
+
iter::try_process(iter.into_iter(), |i| i.collect())
|
|
2157
|
+
}
|
|
2158
|
+
}
|
|
2159
|
+
|
|
2160
|
+
#[unstable(feature = "try_trait_v2", issue = "84277", old_name = "try_trait")]
|
|
2161
|
+
#[rustc_const_unstable(feature = "const_try", issue = "74935")]
|
|
2162
|
+
impl<T, E> const ops::Try for Result<T, E> {
|
|
2163
|
+
type Output = T;
|
|
2164
|
+
type Residual = Result<convert::Infallible, E>;
|
|
2165
|
+
|
|
2166
|
+
#[inline]
|
|
2167
|
+
fn from_output(output: Self::Output) -> Self {
|
|
2168
|
+
Ok(output)
|
|
2169
|
+
}
|
|
2170
|
+
|
|
2171
|
+
#[inline]
|
|
2172
|
+
fn branch(self) -> ControlFlow<Self::Residual, Self::Output> {
|
|
2173
|
+
match self {
|
|
2174
|
+
Ok(v) => ControlFlow::Continue(v),
|
|
2175
|
+
Err(e) => ControlFlow::Break(Err(e)),
|
|
2176
|
+
}
|
|
2177
|
+
}
|
|
2178
|
+
}
|
|
2179
|
+
|
|
2180
|
+
#[unstable(feature = "try_trait_v2", issue = "84277", old_name = "try_trait")]
|
|
2181
|
+
#[rustc_const_unstable(feature = "const_try", issue = "74935")]
|
|
2182
|
+
impl<T, E, F: [const] From<E>> const ops::FromResidual<Result<convert::Infallible, E>>
|
|
2183
|
+
for Result<T, F>
|
|
2184
|
+
{
|
|
2185
|
+
#[inline]
|
|
2186
|
+
#[track_caller]
|
|
2187
|
+
fn from_residual(residual: Result<convert::Infallible, E>) -> Self {
|
|
2188
|
+
match residual {
|
|
2189
|
+
Err(e) => Err(From::from(e)),
|
|
2190
|
+
}
|
|
2191
|
+
}
|
|
2192
|
+
}
|
|
2193
|
+
#[diagnostic::do_not_recommend]
|
|
2194
|
+
#[unstable(feature = "try_trait_v2_yeet", issue = "96374")]
|
|
2195
|
+
#[rustc_const_unstable(feature = "const_try", issue = "74935")]
|
|
2196
|
+
impl<T, E, F: [const] From<E>> const ops::FromResidual<ops::Yeet<E>> for Result<T, F> {
|
|
2197
|
+
#[inline]
|
|
2198
|
+
fn from_residual(ops::Yeet(e): ops::Yeet<E>) -> Self {
|
|
2199
|
+
Err(From::from(e))
|
|
2200
|
+
}
|
|
2201
|
+
}
|
|
2202
|
+
|
|
2203
|
+
#[unstable(feature = "try_trait_v2_residual", issue = "91285")]
|
|
2204
|
+
#[rustc_const_unstable(feature = "const_try", issue = "74935")]
|
|
2205
|
+
impl<T, E> const ops::Residual<T> for Result<convert::Infallible, E> {
|
|
2206
|
+
type TryType = Result<T, E>;
|
|
2207
|
+
}
|