twitch_irc/message/commands/
ping.rs1use 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#[derive(Debug, Clone, PartialEq, Eq)]
10#[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))]
11pub struct PingMessage {
12 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 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}