summary refs log tree commit diff
path: root/src/test/ui/result-opt-conversions.rs
blob: 57f258aab654a6c4e588c82378a6d1540898821e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
// run-pass

#[derive(Copy, Clone, Debug, PartialEq)]
struct BadNumErr;

fn try_num(x: i32) -> Result<i32, BadNumErr> {
    if x <= 5 {
        Ok(x + 1)
    } else {
        Err(BadNumErr)
    }
}

type ResOpt = Result<Option<i32>, BadNumErr>;
type OptRes = Option<Result<i32, BadNumErr>>;

fn main() {
    let mut x: ResOpt = Ok(Some(5));
    let mut y: OptRes = Some(Ok(5));
    assert_eq!(x, y.transpose());
    assert_eq!(x.transpose(), y);

    x = Ok(None);
    y = None;
    assert_eq!(x, y.transpose());
    assert_eq!(x.transpose(), y);

    x = Err(BadNumErr);
    y = Some(Err(BadNumErr));
    assert_eq!(x, y.transpose());
    assert_eq!(x.transpose(), y);

    let res: Result<Vec<i32>, BadNumErr> =
        (0..10)
            .map(|x| {
                let y = try_num(x)?;
                Ok(if y % 2 == 0 {
                    Some(y - 1)
                } else {
                    None
                })
            })
            .filter_map(Result::transpose)
            .collect();

    assert_eq!(res, Err(BadNumErr))
}