diff --git a/crates/projection-irc/tests/lib.rs b/crates/projection-irc/tests/lib.rs index 240a067..36b9040 100644 --- a/crates/projection-irc/tests/lib.rs +++ b/crates/projection-irc/tests/lib.rs @@ -271,11 +271,10 @@ async fn scenario_two_users() -> Result<()> { // The first user should receive the message s1.expect(":tester2 PRIVMSG #test :Hello").await?; // Leave the channel from the first user - // TODO implement irc PART command - // s1.send("PART #test").await?; - // s1.expect(":tester1 PART #test").await?; + s1.send("PART #test").await?; + s1.expect(":tester1 PART #test").await?; // The second user should receive the PART message - // s2.expect(":tester1 PART #test").await?; + s2.expect(":tester1 PART #test").await?; Ok(()) } diff --git a/crates/proto-irc/src/client.rs b/crates/proto-irc/src/client.rs index 66cf107..a692e92 100644 --- a/crates/proto-irc/src/client.rs +++ b/crates/proto-irc/src/client.rs @@ -49,7 +49,7 @@ pub enum ClientMessage { }, Part { chan: Chan, - message: Str, + message: Option, }, /// `PRIVMSG :` PrivateMessage { @@ -194,14 +194,20 @@ fn client_message_topic(input: &str) -> IResult<&str, ClientMessage> { fn client_message_part(input: &str) -> IResult<&str, ClientMessage> { let (input, _) = tag("PART ")(input)?; let (input, chan) = chan(input)?; - let (input, _) = tag(" ")(input)?; + let (input, t) = opt(tag(" "))(input)?; + match t { + Some(_) => (), + None => { + return Ok((input, ClientMessage::Part { chan, message: None })); + } + } let (input, r) = opt(tag(":"))(input)?; let (input, message) = match r { Some(_) => token(input)?, None => receiver(input)?, }; - let message = message.into(); + let message = Some(message.into()); Ok((input, ClientMessage::Part { chan, message })) } @@ -369,7 +375,18 @@ mod test { let input = "PART #chan :Pokasiki !!!"; let expected = ClientMessage::Part { chan: Chan::Global("chan".into()), - message: "Pokasiki !!!".into(), + message: Some("Pokasiki !!!".into()), + }; + + let result = client_message(input); + assert_matches!(result, Ok(result) => assert_eq!(expected, result)); + } + #[test] + fn test_client_message_part_empty() { + let input = "PART #chan"; + let expected = ClientMessage::Part { + chan: Chan::Global("chan".into()), + message: None, }; let result = client_message(input);