twitch_irc/message/commands/
reconnect.rs

1use crate::message::commands::ServerMessageParseError;
2use crate::message::commands::ServerMessageParseError::MismatchedCommand;
3use crate::message::IRCMessage;
4use std::convert::TryFrom;
5
6#[cfg(feature = "with-serde")]
7use {serde::Deserialize, serde::Serialize};
8
9/// Sent by the server to signal a connection to disconnect and reconnect
10#[derive(Debug, Clone, PartialEq, Eq)]
11#[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))]
12pub struct ReconnectMessage {
13    /// The message that this `ReconnectMessage` was parsed from.
14    pub source: IRCMessage,
15}
16
17impl TryFrom<IRCMessage> for ReconnectMessage {
18    type Error = ServerMessageParseError;
19
20    fn try_from(source: IRCMessage) -> Result<ReconnectMessage, ServerMessageParseError> {
21        if source.command == "RECONNECT" {
22            Ok(ReconnectMessage { source })
23        } else {
24            Err(MismatchedCommand(source))
25        }
26    }
27}
28
29impl From<ReconnectMessage> for IRCMessage {
30    fn from(msg: ReconnectMessage) -> IRCMessage {
31        msg.source
32    }
33}
34
35#[cfg(test)]
36mod tests {
37    use crate::message::{IRCMessage, ReconnectMessage};
38    use std::convert::TryFrom;
39
40    #[test]
41    pub fn test_basic() {
42        let src = ":tmi.twitch.tv RECONNECT";
43        let irc_message = IRCMessage::parse(src).unwrap();
44        let msg = ReconnectMessage::try_from(irc_message.clone()).unwrap();
45
46        assert_eq!(
47            msg,
48            ReconnectMessage {
49                source: irc_message
50            }
51        )
52    }
53}