Skip to main content

twitch_irc/message/commands/
ping.rs

1use crate::message::IRCMessage;
2use crate::message::commands::ServerMessageParseError;
3use std::convert::TryFrom;
4
5#[cfg(feature = "with-serde")]
6use {serde::Deserialize, serde::Serialize};
7
8/// A `PING` connection-control message.
9#[derive(Debug, Clone, PartialEq, Eq)]
10#[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))]
11pub struct PingMessage {
12    /// The message that this `PingMessage` was parsed from.
13    pub source: IRCMessage,
14}
15
16impl TryFrom<IRCMessage> for PingMessage {
17    type Error = ServerMessageParseError;
18
19    fn try_from(source: IRCMessage) -> Result<PingMessage, ServerMessageParseError> {
20        if source.command != "PING" {
21            return Err(ServerMessageParseError::MismatchedCommand(Box::new(source)));
22        }
23
24        Ok(PingMessage { source })
25    }
26}
27
28impl From<PingMessage> for IRCMessage {
29    fn from(msg: PingMessage) -> IRCMessage {
30        msg.source
31    }
32}
33
34#[cfg(test)]
35mod tests {
36    use crate::message::{IRCMessage, PingMessage};
37    use std::convert::TryFrom;
38
39    #[test]
40    pub fn test_basic() {
41        let src = ":tmi.twitch.tv PING";
42        let irc_message = IRCMessage::parse(src).unwrap();
43        let msg = PingMessage::try_from(irc_message.clone()).unwrap();
44
45        assert_eq!(
46            msg,
47            PingMessage {
48                source: irc_message
49            }
50        );
51    }
52
53    #[test]
54    pub fn test_with_arguments() {
55        // want to make sure we can handle changing formats
56        let src = ":tmi.twitch.tv PING test :abc def";
57        let irc_message = IRCMessage::parse(src).unwrap();
58        let msg = PingMessage::try_from(irc_message.clone()).unwrap();
59
60        assert_eq!(
61            msg,
62            PingMessage {
63                source: irc_message
64            }
65        );
66    }
67}