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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
use super::{commands, Message};
macro_rules! filter_this {
($($t:ident),+ $(,)?) => {
$(impl MessageFilter for commands::$t {
fn to_filter() -> Filter {
Filter::$t
}
}
impl From<Message> for commands::$t {
fn from(msg: Message) -> Self {
match msg {
Message::$t(d @ commands::$t { .. }) => d,
_ => unreachable!(),
}
}
})*
};
}
filter_this!(
Join,
Part,
PrivMsg,
Mode,
NamesStart,
NamesEnd,
ClearChat,
ClearMsg,
HostTargetStart,
HostTargetEnd,
Notice,
Reconnect,
RoomState,
UserNotice,
UserState,
GlobalUserState,
);
#[derive(Copy, Clone, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)]
pub enum Filter {
Irc,
Join,
Part,
PrivMsg,
Mode,
NamesStart,
NamesEnd,
ClearChat,
ClearMsg,
HostTargetStart,
HostTargetEnd,
Notice,
Reconnect,
RoomState,
UserNotice,
UserState,
GlobalUserState,
#[doc(hidden)]
__Nonexhaustive,
}
pub trait MessageFilter {
fn to_filter() -> Filter;
}
impl Message {
pub(crate) fn what_filter(&self) -> Filter {
use Filter::*;
match self {
Message::Join { .. } => Join,
Message::Part { .. } => Part,
Message::PrivMsg { .. } => PrivMsg,
Message::Mode { .. } => Mode,
Message::NamesStart { .. } => NamesStart,
Message::NamesEnd { .. } => NamesEnd,
Message::ClearChat { .. } => ClearChat,
Message::ClearMsg { .. } => ClearMsg,
Message::HostTargetStart { .. } => HostTargetStart,
Message::HostTargetEnd { .. } => HostTargetEnd,
Message::Notice { .. } => Notice,
Message::Reconnect { .. } => Reconnect,
Message::RoomState { .. } => RoomState,
Message::UserNotice { .. } => UserNotice,
Message::UserState { .. } => UserState,
Message::GlobalUserState { .. } => GlobalUserState,
Message::Irc { .. } => Irc,
Message::__Nonexhaustive => unreachable!(),
}
}
}