core/
result.rs

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

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy