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
48
49
50
use core::fmt::Debug;
use crate::Message;

/// A result from `watch()`.
#[derive(Debug)]
pub enum Watched<T: Debug> {
    /// The provided Future completed.
    Completed(T),
    /// A message was received.
    Messaged(Message),
}

use Watched::{Completed, Messaged};

impl<T: Debug> Watched<T> {

    /// True if the future completed.
    pub fn is_completed(&self) -> bool {
        if let Messaged(_) = self { true } else { false }
    }

    /// True if we received a message.
    pub fn is_messaged(&self) -> bool {
        if let Messaged(_) = self { true } else { false }
    }

    /// Take the completed result or panic.
    pub fn unwrap_completed(self) -> T {
        if let Completed(c) = self { c }
        else { panic!("Watched is not Completed"); }
    }

    /// Take the received message or panic.
    pub fn unwrap_messaged(self) -> Message {
        if let Messaged(m) = self { m }
        else { panic!("Watched is not Messaged"); }
    }
}

impl<T: Debug + PartialEq> PartialEq for Watched<T> {
    fn eq(&self, other: &Self) -> bool {
        match (self, other) {
            (Completed(l), Completed(r)) => *l == *r,
            (Messaged(l), Messaged(r)) => *l == *r,
            _ => false,
        }
    }
}

impl<T: Debug + Eq> Eq for Watched<T> {}