fix irc parsing

it's not required to start trailing arg with : if it doesn't contain spaces
This commit is contained in:
Nikita Vilunov 2023-07-03 22:26:37 +02:00
parent daf05869a3
commit 8efbacc4d0
1 changed files with 26 additions and 8 deletions

View File

@ -1,5 +1,7 @@
use super::*;
use nom::combinator::opt;
/// Client-to-server command.
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum ClientMessage {
@ -121,8 +123,12 @@ fn client_message_user(input: &str) -> IResult<&str, ClientMessage> {
let (input, _) = receiver(input)?;
let (input, _) = tag(" ")(input)?;
let (input, _) = receiver(input)?;
let (input, _) = tag(" :")(input)?;
let (input, realname) = token(input)?;
let (input, _) = tag(" ")(input)?;
let (input, r) = opt(tag(":"))(input)?;
let (input, realname) = match r {
Some(_) => token(input)?,
None => receiver(input)?,
};
Ok((
input,
@ -156,8 +162,12 @@ fn client_message_who(input: &str) -> IResult<&str, ClientMessage> {
fn client_message_topic(input: &str) -> IResult<&str, ClientMessage> {
let (input, _) = tag("TOPIC ")(input)?;
let (input, chan) = chan(input)?;
let (input, _) = tag(" :")(input)?;
let (input, topic) = token(input)?;
let (input, _) = tag(" ")(input)?;
let (input, r) = opt(tag(":"))(input)?;
let (input, topic) = match r {
Some(_) => token(input)?,
None => receiver(input)?,
};
let topic = topic.into();
Ok((input, ClientMessage::Topic { chan, topic }))
@ -166,8 +176,12 @@ 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, message) = token(input)?;
let (input, _) = tag(" ")(input)?;
let (input, r) = opt(tag(":"))(input)?;
let (input, message) = match r {
Some(_) => token(input)?,
None => receiver(input)?,
};
let message = message.into();
Ok((input, ClientMessage::Part { chan, message }))
@ -176,8 +190,12 @@ fn client_message_part(input: &str) -> IResult<&str, ClientMessage> {
fn client_message_privmsg(input: &str) -> IResult<&str, ClientMessage> {
let (input, _) = tag("PRIVMSG ")(input)?;
let (input, recipient) = recipient(input)?;
let (input, _) = tag(" :")(input)?;
let (input, body) = token(input)?;
let (input, _) = tag(" ")(input)?;
let (input, r) = opt(tag(":"))(input)?;
let (input, body) = match r {
Some(_) => token(input)?,
None => receiver(input)?,
};
let body = body.into();
Ok((input, ClientMessage::PrivateMessage { recipient, body }))