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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
use bincode::Decode;
use bincode::Encode;

use serde::Deserialize;
use serde::Serialize;

/// Represents the reason a process exits.
#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize, Encode, Decode)]
pub enum ExitReason {
    /// Exited due to normal reasons, function ended, or manually stopped.
    #[default]
    Normal,
    /// Forceful kill reason.
    Kill,
    /// Ignored reason.
    Ignore,
    /// Custom exit reason.
    Custom(String),
}

impl ExitReason {
    /// Whether or not the reason is normal.
    pub const fn is_normal(&self) -> bool {
        matches!(self, ExitReason::Normal)
    }

    /// Whether or not the reason is kill.
    pub const fn is_kill(&self) -> bool {
        matches!(self, ExitReason::Kill)
    }

    /// Whether or not the reason is ignore.
    pub const fn is_ignore(&self) -> bool {
        matches!(self, ExitReason::Ignore)
    }

    /// Whether or not the reason is custom.
    pub const fn is_custom(&self) -> bool {
        matches!(self, ExitReason::Custom(_))
    }
}

impl From<String> for ExitReason {
    fn from(value: String) -> Self {
        Self::Custom(value)
    }
}

impl From<&str> for ExitReason {
    fn from(value: &str) -> Self {
        Self::Custom(value.to_string())
    }
}

impl PartialEq<&str> for ExitReason {
    fn eq(&self, other: &&str) -> bool {
        match self {
            Self::Custom(reason) => reason == other,
            _ => false,
        }
    }
}

impl PartialEq<ExitReason> for &str {
    fn eq(&self, other: &ExitReason) -> bool {
        match other {
            ExitReason::Custom(reason) => self == reason,
            _ => false,
        }
    }
}