diff --git a/crates/proto-irc/src/server.rs b/crates/proto-irc/src/server.rs index 72c7d15..3e7fbd2 100644 --- a/crates/proto-irc/src/server.rs +++ b/crates/proto-irc/src/server.rs @@ -355,6 +355,7 @@ fn server_message_body(input: &str) -> IResult<&str, ServerMessageBody> { server_message_body_notice, server_message_body_ping, server_message_body_pong, + server_message_body_cap, ))(input) } @@ -380,12 +381,7 @@ fn server_message_body_ping(input: &str) -> IResult<&str, ServerMessageBody> { let (input, _) = tag("PING ")(input)?; let (input, token) = token(input)?; - Ok(( - input, - ServerMessageBody::Ping { - token: token.into(), - }, - )) + Ok((input, ServerMessageBody::Ping { token: token.into() })) } fn server_message_body_pong(input: &str) -> IResult<&str, ServerMessageBody> { @@ -403,6 +399,21 @@ fn server_message_body_pong(input: &str) -> IResult<&str, ServerMessageBody> { )) } +fn server_message_body_cap(input: &str) -> IResult<&str, ServerMessageBody> { + let (input, _) = tag("CAP ")(input)?; + let (input, from) = receiver(input)?; + let (input, _) = tag(" LS :")(input)?; + let (input, token) = token(input)?; + + Ok(( + input, + ServerMessageBody::Cap { + target: from.into(), + subcmd: CapSubBody::Ls(token.into()), + }, + )) +} + #[cfg(test)] mod test { use assert_matches::*; @@ -427,9 +438,7 @@ mod test { assert_matches!(result, Ok((_, result)) => assert_eq!(expected, result)); let mut bytes = vec![]; - sync_future(expected.write_async(&mut bytes)) - .unwrap() - .unwrap(); + sync_future(expected.write_async(&mut bytes)).unwrap().unwrap(); assert_eq!(bytes, input.as_bytes()); } @@ -449,9 +458,27 @@ mod test { assert_matches!(result, Ok((_, result)) => assert_eq!(expected, result)); let mut bytes = vec![]; - sync_future(expected.write_async(&mut bytes)) - .unwrap() - .unwrap(); + sync_future(expected.write_async(&mut bytes)).unwrap().unwrap(); + assert_eq!(bytes, input.as_bytes()); + } + + #[test] + fn test_server_message_cap_ls() { + let input = "CAP * LS :sasl\r\n"; + let expected = ServerMessage { + tags: vec![], + sender: None, + body: ServerMessageBody::Cap { + target: "*".into(), + subcmd: CapSubBody::Ls("sasl".into()), + }, + }; + + let result = server_message(input); + assert_matches!(result, Ok((_, result)) => assert_eq!(expected, result)); + + let mut bytes = vec![]; + sync_future(expected.write_async(&mut bytes)).unwrap().unwrap(); assert_eq!(bytes, input.as_bytes()); } }