Files
empidee/src/commands/client_to_client/sendmessage.rs

58 lines
1.7 KiB
Rust

use serde::{Deserialize, Serialize};
use crate::{
commands::{Command, CommandRequest, RequestParserError, empty_command_response},
common::types::ChannelName,
request_tokenizer::RequestTokenizer,
};
pub struct SendMessage;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SendMessageRequest {
pub channel: ChannelName,
pub message: String,
}
impl CommandRequest<'_> for SendMessageRequest {
const COMMAND: &'static str = "sendmessage";
fn into_request_enum(self) -> crate::Request {
crate::Request::SendMessage(self.channel, self.message)
}
fn from_request_enum(request: crate::Request) -> Option<Self> {
match request {
crate::Request::SendMessage(channel, message) => {
Some(SendMessageRequest { channel, message })
}
_ => None,
}
}
fn serialize(&self) -> String {
format!("{} {} {}", Self::COMMAND, self.channel, self.message)
}
fn parse(mut parts: RequestTokenizer<'_>) -> Result<Self, RequestParserError> {
let channel = parts.next().ok_or(RequestParserError::UnexpectedEOF)?;
let channel = channel
.parse()
.map_err(|_| RequestParserError::SyntaxError(0, channel.to_owned()))?;
// TODO: SplitWhitespace::remainder() is unstable, use when stable
let message = parts.collect::<Vec<_>>().join(" ");
debug_assert!(!message.is_empty());
Ok(SendMessageRequest { channel, message })
}
}
empty_command_response!(SendMessage);
impl Command<'_, '_> for SendMessage {
type Request = SendMessageRequest;
type Response = SendMessageResponse;
}