• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //! The enum [`Either`] with variants `Left` and `Right` is a general purpose
2 //! sum type with two cases.
3 //!
4 //! [`Either`]: enum.Either.html
5 //!
6 //! **Crate features:**
7 //!
8 //! * `"use_std"`
9 //! Enabled by default. Disable to make the library `#![no_std]`.
10 //!
11 //! * `"serde"`
12 //! Disabled by default. Enable to `#[derive(Serialize, Deserialize)]` for `Either`
13 //!
14 
15 #![doc(html_root_url = "https://docs.rs/either/1/")]
16 #![no_std]
17 
18 #[cfg(any(test, feature = "use_std"))]
19 extern crate std;
20 
21 #[cfg(feature = "serde")]
22 pub mod serde_untagged;
23 
24 #[cfg(feature = "serde")]
25 pub mod serde_untagged_optional;
26 
27 use core::convert::{AsMut, AsRef};
28 use core::fmt;
29 use core::future::Future;
30 use core::iter;
31 use core::ops::Deref;
32 use core::ops::DerefMut;
33 use core::pin::Pin;
34 
35 #[cfg(any(test, feature = "use_std"))]
36 use std::error::Error;
37 #[cfg(any(test, feature = "use_std"))]
38 use std::io::{self, BufRead, Read, Seek, SeekFrom, Write};
39 
40 pub use crate::Either::{Left, Right};
41 
42 /// The enum `Either` with variants `Left` and `Right` is a general purpose
43 /// sum type with two cases.
44 ///
45 /// The `Either` type is symmetric and treats its variants the same way, without
46 /// preference.
47 /// (For representing success or error, use the regular `Result` enum instead.)
48 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
49 #[derive(Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)]
50 pub enum Either<L, R> {
51     /// A value of type `L`.
52     Left(L),
53     /// A value of type `R`.
54     Right(R),
55 }
56 
57 /// Evaluate the provided expression for both [`Either::Left`] and [`Either::Right`].
58 ///
59 /// This macro is useful in cases where both sides of [`Either`] can be interacted with
60 /// in the same way even though the don't share the same type.
61 ///
62 /// Syntax: `either::for_both!(` *expression* `,` *pattern* `=>` *expression* `)`
63 ///
64 /// # Example
65 ///
66 /// ```
67 /// use either::Either;
68 ///
69 /// fn length(owned_or_borrowed: Either<String, &'static str>) -> usize {
70 ///     either::for_both!(owned_or_borrowed, s => s.len())
71 /// }
72 ///
73 /// fn main() {
74 ///     let borrowed = Either::Right("Hello world!");
75 ///     let owned = Either::Left("Hello world!".to_owned());
76 ///
77 ///     assert_eq!(length(borrowed), 12);
78 ///     assert_eq!(length(owned), 12);
79 /// }
80 /// ```
81 #[macro_export]
82 macro_rules! for_both {
83     ($value:expr, $pattern:pat => $result:expr) => {
84         match $value {
85             $crate::Either::Left($pattern) => $result,
86             $crate::Either::Right($pattern) => $result,
87         }
88     };
89 }
90 
91 /// Macro for unwrapping the left side of an `Either`, which fails early
92 /// with the opposite side. Can only be used in functions that return
93 /// `Either` because of the early return of `Right` that it provides.
94 ///
95 /// See also `try_right!` for its dual, which applies the same just to the
96 /// right side.
97 ///
98 /// # Example
99 ///
100 /// ```
101 /// use either::{Either, Left, Right};
102 ///
103 /// fn twice(wrapper: Either<u32, &str>) -> Either<u32, &str> {
104 ///     let value = either::try_left!(wrapper);
105 ///     Left(value * 2)
106 /// }
107 ///
108 /// fn main() {
109 ///     assert_eq!(twice(Left(2)), Left(4));
110 ///     assert_eq!(twice(Right("ups")), Right("ups"));
111 /// }
112 /// ```
113 #[macro_export]
114 macro_rules! try_left {
115     ($expr:expr) => {
116         match $expr {
117             $crate::Left(val) => val,
118             $crate::Right(err) => return $crate::Right(::core::convert::From::from(err)),
119         }
120     };
121 }
122 
123 /// Dual to `try_left!`, see its documentation for more information.
124 #[macro_export]
125 macro_rules! try_right {
126     ($expr:expr) => {
127         match $expr {
128             $crate::Left(err) => return $crate::Left(::core::convert::From::from(err)),
129             $crate::Right(val) => val,
130         }
131     };
132 }
133 
134 impl<L: Clone, R: Clone> Clone for Either<L, R> {
clone(&self) -> Self135     fn clone(&self) -> Self {
136         match self {
137             Left(inner) => Left(inner.clone()),
138             Right(inner) => Right(inner.clone()),
139         }
140     }
141 
clone_from(&mut self, source: &Self)142     fn clone_from(&mut self, source: &Self) {
143         match (self, source) {
144             (Left(dest), Left(source)) => dest.clone_from(source),
145             (Right(dest), Right(source)) => dest.clone_from(source),
146             (dest, source) => *dest = source.clone(),
147         }
148     }
149 }
150 
151 impl<L, R> Either<L, R> {
152     /// Return true if the value is the `Left` variant.
153     ///
154     /// ```
155     /// use either::*;
156     ///
157     /// let values = [Left(1), Right("the right value")];
158     /// assert_eq!(values[0].is_left(), true);
159     /// assert_eq!(values[1].is_left(), false);
160     /// ```
is_left(&self) -> bool161     pub fn is_left(&self) -> bool {
162         match *self {
163             Left(_) => true,
164             Right(_) => false,
165         }
166     }
167 
168     /// Return true if the value is the `Right` variant.
169     ///
170     /// ```
171     /// use either::*;
172     ///
173     /// let values = [Left(1), Right("the right value")];
174     /// assert_eq!(values[0].is_right(), false);
175     /// assert_eq!(values[1].is_right(), true);
176     /// ```
is_right(&self) -> bool177     pub fn is_right(&self) -> bool {
178         !self.is_left()
179     }
180 
181     /// Convert the left side of `Either<L, R>` to an `Option<L>`.
182     ///
183     /// ```
184     /// use either::*;
185     ///
186     /// let left: Either<_, ()> = Left("some value");
187     /// assert_eq!(left.left(),  Some("some value"));
188     ///
189     /// let right: Either<(), _> = Right(321);
190     /// assert_eq!(right.left(), None);
191     /// ```
left(self) -> Option<L>192     pub fn left(self) -> Option<L> {
193         match self {
194             Left(l) => Some(l),
195             Right(_) => None,
196         }
197     }
198 
199     /// Convert the right side of `Either<L, R>` to an `Option<R>`.
200     ///
201     /// ```
202     /// use either::*;
203     ///
204     /// let left: Either<_, ()> = Left("some value");
205     /// assert_eq!(left.right(),  None);
206     ///
207     /// let right: Either<(), _> = Right(321);
208     /// assert_eq!(right.right(), Some(321));
209     /// ```
right(self) -> Option<R>210     pub fn right(self) -> Option<R> {
211         match self {
212             Left(_) => None,
213             Right(r) => Some(r),
214         }
215     }
216 
217     /// Convert `&Either<L, R>` to `Either<&L, &R>`.
218     ///
219     /// ```
220     /// use either::*;
221     ///
222     /// let left: Either<_, ()> = Left("some value");
223     /// assert_eq!(left.as_ref(), Left(&"some value"));
224     ///
225     /// let right: Either<(), _> = Right("some value");
226     /// assert_eq!(right.as_ref(), Right(&"some value"));
227     /// ```
as_ref(&self) -> Either<&L, &R>228     pub fn as_ref(&self) -> Either<&L, &R> {
229         match *self {
230             Left(ref inner) => Left(inner),
231             Right(ref inner) => Right(inner),
232         }
233     }
234 
235     /// Convert `&mut Either<L, R>` to `Either<&mut L, &mut R>`.
236     ///
237     /// ```
238     /// use either::*;
239     ///
240     /// fn mutate_left(value: &mut Either<u32, u32>) {
241     ///     if let Some(l) = value.as_mut().left() {
242     ///         *l = 999;
243     ///     }
244     /// }
245     ///
246     /// let mut left = Left(123);
247     /// let mut right = Right(123);
248     /// mutate_left(&mut left);
249     /// mutate_left(&mut right);
250     /// assert_eq!(left, Left(999));
251     /// assert_eq!(right, Right(123));
252     /// ```
as_mut(&mut self) -> Either<&mut L, &mut R>253     pub fn as_mut(&mut self) -> Either<&mut L, &mut R> {
254         match *self {
255             Left(ref mut inner) => Left(inner),
256             Right(ref mut inner) => Right(inner),
257         }
258     }
259 
260     /// Convert `Pin<&Either<L, R>>` to `Either<Pin<&L>, Pin<&R>>`,
261     /// pinned projections of the inner variants.
as_pin_ref(self: Pin<&Self>) -> Either<Pin<&L>, Pin<&R>>262     pub fn as_pin_ref(self: Pin<&Self>) -> Either<Pin<&L>, Pin<&R>> {
263         // SAFETY: We can use `new_unchecked` because the `inner` parts are
264         // guaranteed to be pinned, as they come from `self` which is pinned.
265         unsafe {
266             match *Pin::get_ref(self) {
267                 Left(ref inner) => Left(Pin::new_unchecked(inner)),
268                 Right(ref inner) => Right(Pin::new_unchecked(inner)),
269             }
270         }
271     }
272 
273     /// Convert `Pin<&mut Either<L, R>>` to `Either<Pin<&mut L>, Pin<&mut R>>`,
274     /// pinned projections of the inner variants.
as_pin_mut(self: Pin<&mut Self>) -> Either<Pin<&mut L>, Pin<&mut R>>275     pub fn as_pin_mut(self: Pin<&mut Self>) -> Either<Pin<&mut L>, Pin<&mut R>> {
276         // SAFETY: `get_unchecked_mut` is fine because we don't move anything.
277         // We can use `new_unchecked` because the `inner` parts are guaranteed
278         // to be pinned, as they come from `self` which is pinned, and we never
279         // offer an unpinned `&mut L` or `&mut R` through `Pin<&mut Self>`. We
280         // also don't have an implementation of `Drop`, nor manual `Unpin`.
281         unsafe {
282             match *Pin::get_unchecked_mut(self) {
283                 Left(ref mut inner) => Left(Pin::new_unchecked(inner)),
284                 Right(ref mut inner) => Right(Pin::new_unchecked(inner)),
285             }
286         }
287     }
288 
289     /// Convert `Either<L, R>` to `Either<R, L>`.
290     ///
291     /// ```
292     /// use either::*;
293     ///
294     /// let left: Either<_, ()> = Left(123);
295     /// assert_eq!(left.flip(), Right(123));
296     ///
297     /// let right: Either<(), _> = Right("some value");
298     /// assert_eq!(right.flip(), Left("some value"));
299     /// ```
flip(self) -> Either<R, L>300     pub fn flip(self) -> Either<R, L> {
301         match self {
302             Left(l) => Right(l),
303             Right(r) => Left(r),
304         }
305     }
306 
307     /// Apply the function `f` on the value in the `Left` variant if it is present rewrapping the
308     /// result in `Left`.
309     ///
310     /// ```
311     /// use either::*;
312     ///
313     /// let left: Either<_, u32> = Left(123);
314     /// assert_eq!(left.map_left(|x| x * 2), Left(246));
315     ///
316     /// let right: Either<u32, _> = Right(123);
317     /// assert_eq!(right.map_left(|x| x * 2), Right(123));
318     /// ```
map_left<F, M>(self, f: F) -> Either<M, R> where F: FnOnce(L) -> M,319     pub fn map_left<F, M>(self, f: F) -> Either<M, R>
320     where
321         F: FnOnce(L) -> M,
322     {
323         match self {
324             Left(l) => Left(f(l)),
325             Right(r) => Right(r),
326         }
327     }
328 
329     /// Apply the function `f` on the value in the `Right` variant if it is present rewrapping the
330     /// result in `Right`.
331     ///
332     /// ```
333     /// use either::*;
334     ///
335     /// let left: Either<_, u32> = Left(123);
336     /// assert_eq!(left.map_right(|x| x * 2), Left(123));
337     ///
338     /// let right: Either<u32, _> = Right(123);
339     /// assert_eq!(right.map_right(|x| x * 2), Right(246));
340     /// ```
map_right<F, S>(self, f: F) -> Either<L, S> where F: FnOnce(R) -> S,341     pub fn map_right<F, S>(self, f: F) -> Either<L, S>
342     where
343         F: FnOnce(R) -> S,
344     {
345         match self {
346             Left(l) => Left(l),
347             Right(r) => Right(f(r)),
348         }
349     }
350 
351     /// Apply one of two functions depending on contents, unifying their result. If the value is
352     /// `Left(L)` then the first function `f` is applied; if it is `Right(R)` then the second
353     /// function `g` is applied.
354     ///
355     /// ```
356     /// use either::*;
357     ///
358     /// fn square(n: u32) -> i32 { (n * n) as i32 }
359     /// fn negate(n: i32) -> i32 { -n }
360     ///
361     /// let left: Either<u32, i32> = Left(4);
362     /// assert_eq!(left.either(square, negate), 16);
363     ///
364     /// let right: Either<u32, i32> = Right(-4);
365     /// assert_eq!(right.either(square, negate), 4);
366     /// ```
either<F, G, T>(self, f: F, g: G) -> T where F: FnOnce(L) -> T, G: FnOnce(R) -> T,367     pub fn either<F, G, T>(self, f: F, g: G) -> T
368     where
369         F: FnOnce(L) -> T,
370         G: FnOnce(R) -> T,
371     {
372         match self {
373             Left(l) => f(l),
374             Right(r) => g(r),
375         }
376     }
377 
378     /// Like `either`, but provide some context to whichever of the
379     /// functions ends up being called.
380     ///
381     /// ```
382     /// // In this example, the context is a mutable reference
383     /// use either::*;
384     ///
385     /// let mut result = Vec::new();
386     ///
387     /// let values = vec![Left(2), Right(2.7)];
388     ///
389     /// for value in values {
390     ///     value.either_with(&mut result,
391     ///                       |ctx, integer| ctx.push(integer),
392     ///                       |ctx, real| ctx.push(f64::round(real) as i32));
393     /// }
394     ///
395     /// assert_eq!(result, vec![2, 3]);
396     /// ```
either_with<Ctx, F, G, T>(self, ctx: Ctx, f: F, g: G) -> T where F: FnOnce(Ctx, L) -> T, G: FnOnce(Ctx, R) -> T,397     pub fn either_with<Ctx, F, G, T>(self, ctx: Ctx, f: F, g: G) -> T
398     where
399         F: FnOnce(Ctx, L) -> T,
400         G: FnOnce(Ctx, R) -> T,
401     {
402         match self {
403             Left(l) => f(ctx, l),
404             Right(r) => g(ctx, r),
405         }
406     }
407 
408     /// Apply the function `f` on the value in the `Left` variant if it is present.
409     ///
410     /// ```
411     /// use either::*;
412     ///
413     /// let left: Either<_, u32> = Left(123);
414     /// assert_eq!(left.left_and_then::<_,()>(|x| Right(x * 2)), Right(246));
415     ///
416     /// let right: Either<u32, _> = Right(123);
417     /// assert_eq!(right.left_and_then(|x| Right::<(), _>(x * 2)), Right(123));
418     /// ```
left_and_then<F, S>(self, f: F) -> Either<S, R> where F: FnOnce(L) -> Either<S, R>,419     pub fn left_and_then<F, S>(self, f: F) -> Either<S, R>
420     where
421         F: FnOnce(L) -> Either<S, R>,
422     {
423         match self {
424             Left(l) => f(l),
425             Right(r) => Right(r),
426         }
427     }
428 
429     /// Apply the function `f` on the value in the `Right` variant if it is present.
430     ///
431     /// ```
432     /// use either::*;
433     ///
434     /// let left: Either<_, u32> = Left(123);
435     /// assert_eq!(left.right_and_then(|x| Right(x * 2)), Left(123));
436     ///
437     /// let right: Either<u32, _> = Right(123);
438     /// assert_eq!(right.right_and_then(|x| Right(x * 2)), Right(246));
439     /// ```
right_and_then<F, S>(self, f: F) -> Either<L, S> where F: FnOnce(R) -> Either<L, S>,440     pub fn right_and_then<F, S>(self, f: F) -> Either<L, S>
441     where
442         F: FnOnce(R) -> Either<L, S>,
443     {
444         match self {
445             Left(l) => Left(l),
446             Right(r) => f(r),
447         }
448     }
449 
450     /// Convert the inner value to an iterator.
451     ///
452     /// ```
453     /// use either::*;
454     ///
455     /// let left: Either<_, Vec<u32>> = Left(vec![1, 2, 3, 4, 5]);
456     /// let mut right: Either<Vec<u32>, _> = Right(vec![]);
457     /// right.extend(left.into_iter());
458     /// assert_eq!(right, Right(vec![1, 2, 3, 4, 5]));
459     /// ```
460     #[allow(clippy::should_implement_trait)]
into_iter(self) -> Either<L::IntoIter, R::IntoIter> where L: IntoIterator, R: IntoIterator<Item = L::Item>,461     pub fn into_iter(self) -> Either<L::IntoIter, R::IntoIter>
462     where
463         L: IntoIterator,
464         R: IntoIterator<Item = L::Item>,
465     {
466         match self {
467             Left(l) => Left(l.into_iter()),
468             Right(r) => Right(r.into_iter()),
469         }
470     }
471 
472     /// Return left value or given value
473     ///
474     /// Arguments passed to `left_or` are eagerly evaluated; if you are passing
475     /// the result of a function call, it is recommended to use [`left_or_else`],
476     /// which is lazily evaluated.
477     ///
478     /// [`left_or_else`]: #method.left_or_else
479     ///
480     /// # Examples
481     ///
482     /// ```
483     /// # use either::*;
484     /// let left: Either<&str, &str> = Left("left");
485     /// assert_eq!(left.left_or("foo"), "left");
486     ///
487     /// let right: Either<&str, &str> = Right("right");
488     /// assert_eq!(right.left_or("left"), "left");
489     /// ```
left_or(self, other: L) -> L490     pub fn left_or(self, other: L) -> L {
491         match self {
492             Either::Left(l) => l,
493             Either::Right(_) => other,
494         }
495     }
496 
497     /// Return left or a default
498     ///
499     /// # Examples
500     ///
501     /// ```
502     /// # use either::*;
503     /// let left: Either<String, u32> = Left("left".to_string());
504     /// assert_eq!(left.left_or_default(), "left");
505     ///
506     /// let right: Either<String, u32> = Right(42);
507     /// assert_eq!(right.left_or_default(), String::default());
508     /// ```
left_or_default(self) -> L where L: Default,509     pub fn left_or_default(self) -> L
510     where
511         L: Default,
512     {
513         match self {
514             Either::Left(l) => l,
515             Either::Right(_) => L::default(),
516         }
517     }
518 
519     /// Returns left value or computes it from a closure
520     ///
521     /// # Examples
522     ///
523     /// ```
524     /// # use either::*;
525     /// let left: Either<String, u32> = Left("3".to_string());
526     /// assert_eq!(left.left_or_else(|_| unreachable!()), "3");
527     ///
528     /// let right: Either<String, u32> = Right(3);
529     /// assert_eq!(right.left_or_else(|x| x.to_string()), "3");
530     /// ```
left_or_else<F>(self, f: F) -> L where F: FnOnce(R) -> L,531     pub fn left_or_else<F>(self, f: F) -> L
532     where
533         F: FnOnce(R) -> L,
534     {
535         match self {
536             Either::Left(l) => l,
537             Either::Right(r) => f(r),
538         }
539     }
540 
541     /// Return right value or given value
542     ///
543     /// Arguments passed to `right_or` are eagerly evaluated; if you are passing
544     /// the result of a function call, it is recommended to use [`right_or_else`],
545     /// which is lazily evaluated.
546     ///
547     /// [`right_or_else`]: #method.right_or_else
548     ///
549     /// # Examples
550     ///
551     /// ```
552     /// # use either::*;
553     /// let right: Either<&str, &str> = Right("right");
554     /// assert_eq!(right.right_or("foo"), "right");
555     ///
556     /// let left: Either<&str, &str> = Left("left");
557     /// assert_eq!(left.right_or("right"), "right");
558     /// ```
right_or(self, other: R) -> R559     pub fn right_or(self, other: R) -> R {
560         match self {
561             Either::Left(_) => other,
562             Either::Right(r) => r,
563         }
564     }
565 
566     /// Return right or a default
567     ///
568     /// # Examples
569     ///
570     /// ```
571     /// # use either::*;
572     /// let left: Either<String, u32> = Left("left".to_string());
573     /// assert_eq!(left.right_or_default(), u32::default());
574     ///
575     /// let right: Either<String, u32> = Right(42);
576     /// assert_eq!(right.right_or_default(), 42);
577     /// ```
right_or_default(self) -> R where R: Default,578     pub fn right_or_default(self) -> R
579     where
580         R: Default,
581     {
582         match self {
583             Either::Left(_) => R::default(),
584             Either::Right(r) => r,
585         }
586     }
587 
588     /// Returns right value or computes it from a closure
589     ///
590     /// # Examples
591     ///
592     /// ```
593     /// # use either::*;
594     /// let left: Either<String, u32> = Left("3".to_string());
595     /// assert_eq!(left.right_or_else(|x| x.parse().unwrap()), 3);
596     ///
597     /// let right: Either<String, u32> = Right(3);
598     /// assert_eq!(right.right_or_else(|_| unreachable!()), 3);
599     /// ```
right_or_else<F>(self, f: F) -> R where F: FnOnce(L) -> R,600     pub fn right_or_else<F>(self, f: F) -> R
601     where
602         F: FnOnce(L) -> R,
603     {
604         match self {
605             Either::Left(l) => f(l),
606             Either::Right(r) => r,
607         }
608     }
609 
610     /// Returns the left value
611     ///
612     /// # Examples
613     ///
614     /// ```
615     /// # use either::*;
616     /// let left: Either<_, ()> = Left(3);
617     /// assert_eq!(left.unwrap_left(), 3);
618     /// ```
619     ///
620     /// # Panics
621     ///
622     /// When `Either` is a `Right` value
623     ///
624     /// ```should_panic
625     /// # use either::*;
626     /// let right: Either<(), _> = Right(3);
627     /// right.unwrap_left();
628     /// ```
unwrap_left(self) -> L where R: core::fmt::Debug,629     pub fn unwrap_left(self) -> L
630     where
631         R: core::fmt::Debug,
632     {
633         match self {
634             Either::Left(l) => l,
635             Either::Right(r) => {
636                 panic!("called `Either::unwrap_left()` on a `Right` value: {:?}", r)
637             }
638         }
639     }
640 
641     /// Returns the right value
642     ///
643     /// # Examples
644     ///
645     /// ```
646     /// # use either::*;
647     /// let right: Either<(), _> = Right(3);
648     /// assert_eq!(right.unwrap_right(), 3);
649     /// ```
650     ///
651     /// # Panics
652     ///
653     /// When `Either` is a `Left` value
654     ///
655     /// ```should_panic
656     /// # use either::*;
657     /// let left: Either<_, ()> = Left(3);
658     /// left.unwrap_right();
659     /// ```
unwrap_right(self) -> R where L: core::fmt::Debug,660     pub fn unwrap_right(self) -> R
661     where
662         L: core::fmt::Debug,
663     {
664         match self {
665             Either::Right(r) => r,
666             Either::Left(l) => panic!("called `Either::unwrap_right()` on a `Left` value: {:?}", l),
667         }
668     }
669 
670     /// Returns the left value
671     ///
672     /// # Examples
673     ///
674     /// ```
675     /// # use either::*;
676     /// let left: Either<_, ()> = Left(3);
677     /// assert_eq!(left.expect_left("value was Right"), 3);
678     /// ```
679     ///
680     /// # Panics
681     ///
682     /// When `Either` is a `Right` value
683     ///
684     /// ```should_panic
685     /// # use either::*;
686     /// let right: Either<(), _> = Right(3);
687     /// right.expect_left("value was Right");
688     /// ```
expect_left(self, msg: &str) -> L where R: core::fmt::Debug,689     pub fn expect_left(self, msg: &str) -> L
690     where
691         R: core::fmt::Debug,
692     {
693         match self {
694             Either::Left(l) => l,
695             Either::Right(r) => panic!("{}: {:?}", msg, r),
696         }
697     }
698 
699     /// Returns the right value
700     ///
701     /// # Examples
702     ///
703     /// ```
704     /// # use either::*;
705     /// let right: Either<(), _> = Right(3);
706     /// assert_eq!(right.expect_right("value was Left"), 3);
707     /// ```
708     ///
709     /// # Panics
710     ///
711     /// When `Either` is a `Left` value
712     ///
713     /// ```should_panic
714     /// # use either::*;
715     /// let left: Either<_, ()> = Left(3);
716     /// left.expect_right("value was Right");
717     /// ```
expect_right(self, msg: &str) -> R where L: core::fmt::Debug,718     pub fn expect_right(self, msg: &str) -> R
719     where
720         L: core::fmt::Debug,
721     {
722         match self {
723             Either::Right(r) => r,
724             Either::Left(l) => panic!("{}: {:?}", msg, l),
725         }
726     }
727 
728     /// Convert the contained value into `T`
729     ///
730     /// # Examples
731     ///
732     /// ```
733     /// # use either::*;
734     /// // Both u16 and u32 can be converted to u64.
735     /// let left: Either<u16, u32> = Left(3u16);
736     /// assert_eq!(left.either_into::<u64>(), 3u64);
737     /// let right: Either<u16, u32> = Right(7u32);
738     /// assert_eq!(right.either_into::<u64>(), 7u64);
739     /// ```
either_into<T>(self) -> T where L: Into<T>, R: Into<T>,740     pub fn either_into<T>(self) -> T
741     where
742         L: Into<T>,
743         R: Into<T>,
744     {
745         match self {
746             Either::Left(l) => l.into(),
747             Either::Right(r) => r.into(),
748         }
749     }
750 }
751 
752 impl<L, R> Either<Option<L>, Option<R>> {
753     /// Factors out `None` from an `Either` of [`Option`].
754     ///
755     /// ```
756     /// use either::*;
757     /// let left: Either<_, Option<String>> = Left(Some(vec![0]));
758     /// assert_eq!(left.factor_none(), Some(Left(vec![0])));
759     ///
760     /// let right: Either<Option<Vec<u8>>, _> = Right(Some(String::new()));
761     /// assert_eq!(right.factor_none(), Some(Right(String::new())));
762     /// ```
763     // TODO(MSRV): doc(alias) was stabilized in Rust 1.48
764     // #[doc(alias = "transpose")]
factor_none(self) -> Option<Either<L, R>>765     pub fn factor_none(self) -> Option<Either<L, R>> {
766         match self {
767             Left(l) => l.map(Either::Left),
768             Right(r) => r.map(Either::Right),
769         }
770     }
771 }
772 
773 impl<L, R, E> Either<Result<L, E>, Result<R, E>> {
774     /// Factors out a homogenous type from an `Either` of [`Result`].
775     ///
776     /// Here, the homogeneous type is the `Err` type of the [`Result`].
777     ///
778     /// ```
779     /// use either::*;
780     /// let left: Either<_, Result<String, u32>> = Left(Ok(vec![0]));
781     /// assert_eq!(left.factor_err(), Ok(Left(vec![0])));
782     ///
783     /// let right: Either<Result<Vec<u8>, u32>, _> = Right(Ok(String::new()));
784     /// assert_eq!(right.factor_err(), Ok(Right(String::new())));
785     /// ```
786     // TODO(MSRV): doc(alias) was stabilized in Rust 1.48
787     // #[doc(alias = "transpose")]
factor_err(self) -> Result<Either<L, R>, E>788     pub fn factor_err(self) -> Result<Either<L, R>, E> {
789         match self {
790             Left(l) => l.map(Either::Left),
791             Right(r) => r.map(Either::Right),
792         }
793     }
794 }
795 
796 impl<T, L, R> Either<Result<T, L>, Result<T, R>> {
797     /// Factors out a homogenous type from an `Either` of [`Result`].
798     ///
799     /// Here, the homogeneous type is the `Ok` type of the [`Result`].
800     ///
801     /// ```
802     /// use either::*;
803     /// let left: Either<_, Result<u32, String>> = Left(Err(vec![0]));
804     /// assert_eq!(left.factor_ok(), Err(Left(vec![0])));
805     ///
806     /// let right: Either<Result<u32, Vec<u8>>, _> = Right(Err(String::new()));
807     /// assert_eq!(right.factor_ok(), Err(Right(String::new())));
808     /// ```
809     // TODO(MSRV): doc(alias) was stabilized in Rust 1.48
810     // #[doc(alias = "transpose")]
factor_ok(self) -> Result<T, Either<L, R>>811     pub fn factor_ok(self) -> Result<T, Either<L, R>> {
812         match self {
813             Left(l) => l.map_err(Either::Left),
814             Right(r) => r.map_err(Either::Right),
815         }
816     }
817 }
818 
819 impl<T, L, R> Either<(T, L), (T, R)> {
820     /// Factor out a homogeneous type from an either of pairs.
821     ///
822     /// Here, the homogeneous type is the first element of the pairs.
823     ///
824     /// ```
825     /// use either::*;
826     /// let left: Either<_, (u32, String)> = Left((123, vec![0]));
827     /// assert_eq!(left.factor_first().0, 123);
828     ///
829     /// let right: Either<(u32, Vec<u8>), _> = Right((123, String::new()));
830     /// assert_eq!(right.factor_first().0, 123);
831     /// ```
factor_first(self) -> (T, Either<L, R>)832     pub fn factor_first(self) -> (T, Either<L, R>) {
833         match self {
834             Left((t, l)) => (t, Left(l)),
835             Right((t, r)) => (t, Right(r)),
836         }
837     }
838 }
839 
840 impl<T, L, R> Either<(L, T), (R, T)> {
841     /// Factor out a homogeneous type from an either of pairs.
842     ///
843     /// Here, the homogeneous type is the second element of the pairs.
844     ///
845     /// ```
846     /// use either::*;
847     /// let left: Either<_, (String, u32)> = Left((vec![0], 123));
848     /// assert_eq!(left.factor_second().1, 123);
849     ///
850     /// let right: Either<(Vec<u8>, u32), _> = Right((String::new(), 123));
851     /// assert_eq!(right.factor_second().1, 123);
852     /// ```
factor_second(self) -> (Either<L, R>, T)853     pub fn factor_second(self) -> (Either<L, R>, T) {
854         match self {
855             Left((l, t)) => (Left(l), t),
856             Right((r, t)) => (Right(r), t),
857         }
858     }
859 }
860 
861 impl<T> Either<T, T> {
862     /// Extract the value of an either over two equivalent types.
863     ///
864     /// ```
865     /// use either::*;
866     ///
867     /// let left: Either<_, u32> = Left(123);
868     /// assert_eq!(left.into_inner(), 123);
869     ///
870     /// let right: Either<u32, _> = Right(123);
871     /// assert_eq!(right.into_inner(), 123);
872     /// ```
into_inner(self) -> T873     pub fn into_inner(self) -> T {
874         for_both!(self, inner => inner)
875     }
876 
877     /// Map `f` over the contained value and return the result in the
878     /// corresponding variant.
879     ///
880     /// ```
881     /// use either::*;
882     ///
883     /// let value: Either<_, i32> = Right(42);
884     ///
885     /// let other = value.map(|x| x * 2);
886     /// assert_eq!(other, Right(84));
887     /// ```
map<F, M>(self, f: F) -> Either<M, M> where F: FnOnce(T) -> M,888     pub fn map<F, M>(self, f: F) -> Either<M, M>
889     where
890         F: FnOnce(T) -> M,
891     {
892         match self {
893             Left(l) => Left(f(l)),
894             Right(r) => Right(f(r)),
895         }
896     }
897 }
898 
899 /// Convert from `Result` to `Either` with `Ok => Right` and `Err => Left`.
900 impl<L, R> From<Result<R, L>> for Either<L, R> {
from(r: Result<R, L>) -> Self901     fn from(r: Result<R, L>) -> Self {
902         match r {
903             Err(e) => Left(e),
904             Ok(o) => Right(o),
905         }
906     }
907 }
908 
909 /// Convert from `Either` to `Result` with `Right => Ok` and `Left => Err`.
910 #[allow(clippy::from_over_into)] // From requires RFC 2451, Rust 1.41
911 impl<L, R> Into<Result<R, L>> for Either<L, R> {
into(self) -> Result<R, L>912     fn into(self) -> Result<R, L> {
913         match self {
914             Left(l) => Err(l),
915             Right(r) => Ok(r),
916         }
917     }
918 }
919 
920 impl<L, R, A> Extend<A> for Either<L, R>
921 where
922     L: Extend<A>,
923     R: Extend<A>,
924 {
extend<T>(&mut self, iter: T) where T: IntoIterator<Item = A>,925     fn extend<T>(&mut self, iter: T)
926     where
927         T: IntoIterator<Item = A>,
928     {
929         for_both!(*self, ref mut inner => inner.extend(iter))
930     }
931 }
932 
933 /// `Either<L, R>` is an iterator if both `L` and `R` are iterators.
934 impl<L, R> Iterator for Either<L, R>
935 where
936     L: Iterator,
937     R: Iterator<Item = L::Item>,
938 {
939     type Item = L::Item;
940 
next(&mut self) -> Option<Self::Item>941     fn next(&mut self) -> Option<Self::Item> {
942         for_both!(*self, ref mut inner => inner.next())
943     }
944 
size_hint(&self) -> (usize, Option<usize>)945     fn size_hint(&self) -> (usize, Option<usize>) {
946         for_both!(*self, ref inner => inner.size_hint())
947     }
948 
fold<Acc, G>(self, init: Acc, f: G) -> Acc where G: FnMut(Acc, Self::Item) -> Acc,949     fn fold<Acc, G>(self, init: Acc, f: G) -> Acc
950     where
951         G: FnMut(Acc, Self::Item) -> Acc,
952     {
953         for_both!(self, inner => inner.fold(init, f))
954     }
955 
for_each<F>(self, f: F) where F: FnMut(Self::Item),956     fn for_each<F>(self, f: F)
957     where
958         F: FnMut(Self::Item),
959     {
960         for_both!(self, inner => inner.for_each(f))
961     }
962 
count(self) -> usize963     fn count(self) -> usize {
964         for_both!(self, inner => inner.count())
965     }
966 
last(self) -> Option<Self::Item>967     fn last(self) -> Option<Self::Item> {
968         for_both!(self, inner => inner.last())
969     }
970 
nth(&mut self, n: usize) -> Option<Self::Item>971     fn nth(&mut self, n: usize) -> Option<Self::Item> {
972         for_both!(*self, ref mut inner => inner.nth(n))
973     }
974 
collect<B>(self) -> B where B: iter::FromIterator<Self::Item>,975     fn collect<B>(self) -> B
976     where
977         B: iter::FromIterator<Self::Item>,
978     {
979         for_both!(self, inner => inner.collect())
980     }
981 
partition<B, F>(self, f: F) -> (B, B) where B: Default + Extend<Self::Item>, F: FnMut(&Self::Item) -> bool,982     fn partition<B, F>(self, f: F) -> (B, B)
983     where
984         B: Default + Extend<Self::Item>,
985         F: FnMut(&Self::Item) -> bool,
986     {
987         for_both!(self, inner => inner.partition(f))
988     }
989 
all<F>(&mut self, f: F) -> bool where F: FnMut(Self::Item) -> bool,990     fn all<F>(&mut self, f: F) -> bool
991     where
992         F: FnMut(Self::Item) -> bool,
993     {
994         for_both!(*self, ref mut inner => inner.all(f))
995     }
996 
any<F>(&mut self, f: F) -> bool where F: FnMut(Self::Item) -> bool,997     fn any<F>(&mut self, f: F) -> bool
998     where
999         F: FnMut(Self::Item) -> bool,
1000     {
1001         for_both!(*self, ref mut inner => inner.any(f))
1002     }
1003 
find<P>(&mut self, predicate: P) -> Option<Self::Item> where P: FnMut(&Self::Item) -> bool,1004     fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
1005     where
1006         P: FnMut(&Self::Item) -> bool,
1007     {
1008         for_both!(*self, ref mut inner => inner.find(predicate))
1009     }
1010 
find_map<B, F>(&mut self, f: F) -> Option<B> where F: FnMut(Self::Item) -> Option<B>,1011     fn find_map<B, F>(&mut self, f: F) -> Option<B>
1012     where
1013         F: FnMut(Self::Item) -> Option<B>,
1014     {
1015         for_both!(*self, ref mut inner => inner.find_map(f))
1016     }
1017 
position<P>(&mut self, predicate: P) -> Option<usize> where P: FnMut(Self::Item) -> bool,1018     fn position<P>(&mut self, predicate: P) -> Option<usize>
1019     where
1020         P: FnMut(Self::Item) -> bool,
1021     {
1022         for_both!(*self, ref mut inner => inner.position(predicate))
1023     }
1024 }
1025 
1026 impl<L, R> DoubleEndedIterator for Either<L, R>
1027 where
1028     L: DoubleEndedIterator,
1029     R: DoubleEndedIterator<Item = L::Item>,
1030 {
next_back(&mut self) -> Option<Self::Item>1031     fn next_back(&mut self) -> Option<Self::Item> {
1032         for_both!(*self, ref mut inner => inner.next_back())
1033     }
1034 
1035     // TODO(MSRV): This was stabilized in Rust 1.37
1036     // fn nth_back(&mut self, n: usize) -> Option<Self::Item> {
1037     //     for_both!(*self, ref mut inner => inner.nth_back(n))
1038     // }
1039 
rfold<Acc, G>(self, init: Acc, f: G) -> Acc where G: FnMut(Acc, Self::Item) -> Acc,1040     fn rfold<Acc, G>(self, init: Acc, f: G) -> Acc
1041     where
1042         G: FnMut(Acc, Self::Item) -> Acc,
1043     {
1044         for_both!(self, inner => inner.rfold(init, f))
1045     }
1046 
rfind<P>(&mut self, predicate: P) -> Option<Self::Item> where P: FnMut(&Self::Item) -> bool,1047     fn rfind<P>(&mut self, predicate: P) -> Option<Self::Item>
1048     where
1049         P: FnMut(&Self::Item) -> bool,
1050     {
1051         for_both!(*self, ref mut inner => inner.rfind(predicate))
1052     }
1053 }
1054 
1055 impl<L, R> ExactSizeIterator for Either<L, R>
1056 where
1057     L: ExactSizeIterator,
1058     R: ExactSizeIterator<Item = L::Item>,
1059 {
len(&self) -> usize1060     fn len(&self) -> usize {
1061         for_both!(*self, ref inner => inner.len())
1062     }
1063 }
1064 
1065 impl<L, R> iter::FusedIterator for Either<L, R>
1066 where
1067     L: iter::FusedIterator,
1068     R: iter::FusedIterator<Item = L::Item>,
1069 {
1070 }
1071 
1072 /// `Either<L, R>` is a future if both `L` and `R` are futures.
1073 impl<L, R> Future for Either<L, R>
1074 where
1075     L: Future,
1076     R: Future<Output = L::Output>,
1077 {
1078     type Output = L::Output;
1079 
poll( self: Pin<&mut Self>, cx: &mut core::task::Context<'_>, ) -> core::task::Poll<Self::Output>1080     fn poll(
1081         self: Pin<&mut Self>,
1082         cx: &mut core::task::Context<'_>,
1083     ) -> core::task::Poll<Self::Output> {
1084         for_both!(self.as_pin_mut(), inner => inner.poll(cx))
1085     }
1086 }
1087 
1088 #[cfg(any(test, feature = "use_std"))]
1089 /// `Either<L, R>` implements `Read` if both `L` and `R` do.
1090 ///
1091 /// Requires crate feature `"use_std"`
1092 impl<L, R> Read for Either<L, R>
1093 where
1094     L: Read,
1095     R: Read,
1096 {
read(&mut self, buf: &mut [u8]) -> io::Result<usize>1097     fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
1098         for_both!(*self, ref mut inner => inner.read(buf))
1099     }
1100 
read_exact(&mut self, buf: &mut [u8]) -> io::Result<()>1101     fn read_exact(&mut self, buf: &mut [u8]) -> io::Result<()> {
1102         for_both!(*self, ref mut inner => inner.read_exact(buf))
1103     }
1104 
read_to_end(&mut self, buf: &mut std::vec::Vec<u8>) -> io::Result<usize>1105     fn read_to_end(&mut self, buf: &mut std::vec::Vec<u8>) -> io::Result<usize> {
1106         for_both!(*self, ref mut inner => inner.read_to_end(buf))
1107     }
1108 
read_to_string(&mut self, buf: &mut std::string::String) -> io::Result<usize>1109     fn read_to_string(&mut self, buf: &mut std::string::String) -> io::Result<usize> {
1110         for_both!(*self, ref mut inner => inner.read_to_string(buf))
1111     }
1112 }
1113 
1114 #[cfg(any(test, feature = "use_std"))]
1115 /// `Either<L, R>` implements `Seek` if both `L` and `R` do.
1116 ///
1117 /// Requires crate feature `"use_std"`
1118 impl<L, R> Seek for Either<L, R>
1119 where
1120     L: Seek,
1121     R: Seek,
1122 {
seek(&mut self, pos: SeekFrom) -> io::Result<u64>1123     fn seek(&mut self, pos: SeekFrom) -> io::Result<u64> {
1124         for_both!(*self, ref mut inner => inner.seek(pos))
1125     }
1126 }
1127 
1128 #[cfg(any(test, feature = "use_std"))]
1129 /// Requires crate feature `"use_std"`
1130 impl<L, R> BufRead for Either<L, R>
1131 where
1132     L: BufRead,
1133     R: BufRead,
1134 {
fill_buf(&mut self) -> io::Result<&[u8]>1135     fn fill_buf(&mut self) -> io::Result<&[u8]> {
1136         for_both!(*self, ref mut inner => inner.fill_buf())
1137     }
1138 
consume(&mut self, amt: usize)1139     fn consume(&mut self, amt: usize) {
1140         for_both!(*self, ref mut inner => inner.consume(amt))
1141     }
1142 
read_until(&mut self, byte: u8, buf: &mut std::vec::Vec<u8>) -> io::Result<usize>1143     fn read_until(&mut self, byte: u8, buf: &mut std::vec::Vec<u8>) -> io::Result<usize> {
1144         for_both!(*self, ref mut inner => inner.read_until(byte, buf))
1145     }
1146 
read_line(&mut self, buf: &mut std::string::String) -> io::Result<usize>1147     fn read_line(&mut self, buf: &mut std::string::String) -> io::Result<usize> {
1148         for_both!(*self, ref mut inner => inner.read_line(buf))
1149     }
1150 }
1151 
1152 #[cfg(any(test, feature = "use_std"))]
1153 /// `Either<L, R>` implements `Write` if both `L` and `R` do.
1154 ///
1155 /// Requires crate feature `"use_std"`
1156 impl<L, R> Write for Either<L, R>
1157 where
1158     L: Write,
1159     R: Write,
1160 {
write(&mut self, buf: &[u8]) -> io::Result<usize>1161     fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
1162         for_both!(*self, ref mut inner => inner.write(buf))
1163     }
1164 
write_all(&mut self, buf: &[u8]) -> io::Result<()>1165     fn write_all(&mut self, buf: &[u8]) -> io::Result<()> {
1166         for_both!(*self, ref mut inner => inner.write_all(buf))
1167     }
1168 
write_fmt(&mut self, fmt: fmt::Arguments<'_>) -> io::Result<()>1169     fn write_fmt(&mut self, fmt: fmt::Arguments<'_>) -> io::Result<()> {
1170         for_both!(*self, ref mut inner => inner.write_fmt(fmt))
1171     }
1172 
flush(&mut self) -> io::Result<()>1173     fn flush(&mut self) -> io::Result<()> {
1174         for_both!(*self, ref mut inner => inner.flush())
1175     }
1176 }
1177 
1178 impl<L, R, Target> AsRef<Target> for Either<L, R>
1179 where
1180     L: AsRef<Target>,
1181     R: AsRef<Target>,
1182 {
as_ref(&self) -> &Target1183     fn as_ref(&self) -> &Target {
1184         for_both!(*self, ref inner => inner.as_ref())
1185     }
1186 }
1187 
1188 macro_rules! impl_specific_ref_and_mut {
1189     ($t:ty, $($attr:meta),* ) => {
1190         $(#[$attr])*
1191         impl<L, R> AsRef<$t> for Either<L, R>
1192             where L: AsRef<$t>, R: AsRef<$t>
1193         {
1194             fn as_ref(&self) -> &$t {
1195                 for_both!(*self, ref inner => inner.as_ref())
1196             }
1197         }
1198 
1199         $(#[$attr])*
1200         impl<L, R> AsMut<$t> for Either<L, R>
1201             where L: AsMut<$t>, R: AsMut<$t>
1202         {
1203             fn as_mut(&mut self) -> &mut $t {
1204                 for_both!(*self, ref mut inner => inner.as_mut())
1205             }
1206         }
1207     };
1208 }
1209 
1210 impl_specific_ref_and_mut!(str,);
1211 impl_specific_ref_and_mut!(
1212     ::std::path::Path,
1213     cfg(feature = "use_std"),
1214     doc = "Requires crate feature `use_std`."
1215 );
1216 impl_specific_ref_and_mut!(
1217     ::std::ffi::OsStr,
1218     cfg(feature = "use_std"),
1219     doc = "Requires crate feature `use_std`."
1220 );
1221 impl_specific_ref_and_mut!(
1222     ::std::ffi::CStr,
1223     cfg(feature = "use_std"),
1224     doc = "Requires crate feature `use_std`."
1225 );
1226 
1227 impl<L, R, Target> AsRef<[Target]> for Either<L, R>
1228 where
1229     L: AsRef<[Target]>,
1230     R: AsRef<[Target]>,
1231 {
as_ref(&self) -> &[Target]1232     fn as_ref(&self) -> &[Target] {
1233         for_both!(*self, ref inner => inner.as_ref())
1234     }
1235 }
1236 
1237 impl<L, R, Target> AsMut<Target> for Either<L, R>
1238 where
1239     L: AsMut<Target>,
1240     R: AsMut<Target>,
1241 {
as_mut(&mut self) -> &mut Target1242     fn as_mut(&mut self) -> &mut Target {
1243         for_both!(*self, ref mut inner => inner.as_mut())
1244     }
1245 }
1246 
1247 impl<L, R, Target> AsMut<[Target]> for Either<L, R>
1248 where
1249     L: AsMut<[Target]>,
1250     R: AsMut<[Target]>,
1251 {
as_mut(&mut self) -> &mut [Target]1252     fn as_mut(&mut self) -> &mut [Target] {
1253         for_both!(*self, ref mut inner => inner.as_mut())
1254     }
1255 }
1256 
1257 impl<L, R> Deref for Either<L, R>
1258 where
1259     L: Deref,
1260     R: Deref<Target = L::Target>,
1261 {
1262     type Target = L::Target;
1263 
deref(&self) -> &Self::Target1264     fn deref(&self) -> &Self::Target {
1265         for_both!(*self, ref inner => &**inner)
1266     }
1267 }
1268 
1269 impl<L, R> DerefMut for Either<L, R>
1270 where
1271     L: DerefMut,
1272     R: DerefMut<Target = L::Target>,
1273 {
deref_mut(&mut self) -> &mut Self::Target1274     fn deref_mut(&mut self) -> &mut Self::Target {
1275         for_both!(*self, ref mut inner => &mut *inner)
1276     }
1277 }
1278 
1279 #[cfg(any(test, feature = "use_std"))]
1280 /// `Either` implements `Error` if *both* `L` and `R` implement it.
1281 impl<L, R> Error for Either<L, R>
1282 where
1283     L: Error,
1284     R: Error,
1285 {
source(&self) -> Option<&(dyn Error + 'static)>1286     fn source(&self) -> Option<&(dyn Error + 'static)> {
1287         for_both!(*self, ref inner => inner.source())
1288     }
1289 
1290     #[allow(deprecated)]
description(&self) -> &str1291     fn description(&self) -> &str {
1292         for_both!(*self, ref inner => inner.description())
1293     }
1294 
1295     #[allow(deprecated)]
cause(&self) -> Option<&dyn Error>1296     fn cause(&self) -> Option<&dyn Error> {
1297         for_both!(*self, ref inner => inner.cause())
1298     }
1299 }
1300 
1301 impl<L, R> fmt::Display for Either<L, R>
1302 where
1303     L: fmt::Display,
1304     R: fmt::Display,
1305 {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result1306     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1307         for_both!(*self, ref inner => inner.fmt(f))
1308     }
1309 }
1310 
1311 #[test]
basic()1312 fn basic() {
1313     let mut e = Left(2);
1314     let r = Right(2);
1315     assert_eq!(e, Left(2));
1316     e = r;
1317     assert_eq!(e, Right(2));
1318     assert_eq!(e.left(), None);
1319     assert_eq!(e.right(), Some(2));
1320     assert_eq!(e.as_ref().right(), Some(&2));
1321     assert_eq!(e.as_mut().right(), Some(&mut 2));
1322 }
1323 
1324 #[test]
macros()1325 fn macros() {
1326     use std::string::String;
1327 
1328     fn a() -> Either<u32, u32> {
1329         let x: u32 = try_left!(Right(1337u32));
1330         Left(x * 2)
1331     }
1332     assert_eq!(a(), Right(1337));
1333 
1334     fn b() -> Either<String, &'static str> {
1335         Right(try_right!(Left("foo bar")))
1336     }
1337     assert_eq!(b(), Left(String::from("foo bar")));
1338 }
1339 
1340 #[test]
deref()1341 fn deref() {
1342     use std::string::String;
1343 
1344     fn is_str(_: &str) {}
1345     let value: Either<String, &str> = Left(String::from("test"));
1346     is_str(&*value);
1347 }
1348 
1349 #[test]
iter()1350 fn iter() {
1351     let x = 3;
1352     let mut iter = match x {
1353         3 => Left(0..10),
1354         _ => Right(17..),
1355     };
1356 
1357     assert_eq!(iter.next(), Some(0));
1358     assert_eq!(iter.count(), 9);
1359 }
1360 
1361 #[test]
seek()1362 fn seek() {
1363     use std::io;
1364 
1365     let use_empty = false;
1366     let mut mockdata = [0x00; 256];
1367     for i in 0..256 {
1368         mockdata[i] = i as u8;
1369     }
1370 
1371     let mut reader = if use_empty {
1372         // Empty didn't impl Seek until Rust 1.51
1373         Left(io::Cursor::new([]))
1374     } else {
1375         Right(io::Cursor::new(&mockdata[..]))
1376     };
1377 
1378     let mut buf = [0u8; 16];
1379     assert_eq!(reader.read(&mut buf).unwrap(), buf.len());
1380     assert_eq!(buf, mockdata[..buf.len()]);
1381 
1382     // the first read should advance the cursor and return the next 16 bytes thus the `ne`
1383     assert_eq!(reader.read(&mut buf).unwrap(), buf.len());
1384     assert_ne!(buf, mockdata[..buf.len()]);
1385 
1386     // if the seek operation fails it should read 16..31 instead of 0..15
1387     reader.seek(io::SeekFrom::Start(0)).unwrap();
1388     assert_eq!(reader.read(&mut buf).unwrap(), buf.len());
1389     assert_eq!(buf, mockdata[..buf.len()]);
1390 }
1391 
1392 #[test]
read_write()1393 fn read_write() {
1394     use std::io;
1395 
1396     let use_stdio = false;
1397     let mockdata = [0xff; 256];
1398 
1399     let mut reader = if use_stdio {
1400         Left(io::stdin())
1401     } else {
1402         Right(&mockdata[..])
1403     };
1404 
1405     let mut buf = [0u8; 16];
1406     assert_eq!(reader.read(&mut buf).unwrap(), buf.len());
1407     assert_eq!(&buf, &mockdata[..buf.len()]);
1408 
1409     let mut mockbuf = [0u8; 256];
1410     let mut writer = if use_stdio {
1411         Left(io::stdout())
1412     } else {
1413         Right(&mut mockbuf[..])
1414     };
1415 
1416     let buf = [1u8; 16];
1417     assert_eq!(writer.write(&buf).unwrap(), buf.len());
1418 }
1419 
1420 #[test]
1421 #[allow(deprecated)]
error()1422 fn error() {
1423     let invalid_utf8 = b"\xff";
1424     let res = if let Err(error) = ::std::str::from_utf8(invalid_utf8) {
1425         Err(Left(error))
1426     } else if let Err(error) = "x".parse::<i32>() {
1427         Err(Right(error))
1428     } else {
1429         Ok(())
1430     };
1431     assert!(res.is_err());
1432     res.unwrap_err().description(); // make sure this can be called
1433 }
1434 
1435 /// A helper macro to check if AsRef and AsMut are implemented for a given type.
1436 macro_rules! check_t {
1437     ($t:ty) => {{
1438         fn check_ref<T: AsRef<$t>>() {}
1439         fn propagate_ref<T1: AsRef<$t>, T2: AsRef<$t>>() {
1440             check_ref::<Either<T1, T2>>()
1441         }
1442         fn check_mut<T: AsMut<$t>>() {}
1443         fn propagate_mut<T1: AsMut<$t>, T2: AsMut<$t>>() {
1444             check_mut::<Either<T1, T2>>()
1445         }
1446     }};
1447 }
1448 
1449 // This "unused" method is here to ensure that compilation doesn't fail on given types.
_unsized_ref_propagation()1450 fn _unsized_ref_propagation() {
1451     check_t!(str);
1452 
1453     fn check_array_ref<T: AsRef<[Item]>, Item>() {}
1454     fn check_array_mut<T: AsMut<[Item]>, Item>() {}
1455 
1456     fn propagate_array_ref<T1: AsRef<[Item]>, T2: AsRef<[Item]>, Item>() {
1457         check_array_ref::<Either<T1, T2>, _>()
1458     }
1459 
1460     fn propagate_array_mut<T1: AsMut<[Item]>, T2: AsMut<[Item]>, Item>() {
1461         check_array_mut::<Either<T1, T2>, _>()
1462     }
1463 }
1464 
1465 // This "unused" method is here to ensure that compilation doesn't fail on given types.
1466 #[cfg(feature = "use_std")]
_unsized_std_propagation()1467 fn _unsized_std_propagation() {
1468     check_t!(::std::path::Path);
1469     check_t!(::std::ffi::OsStr);
1470     check_t!(::std::ffi::CStr);
1471 }
1472