1
use serde::{Deserialize, Serialize};
2

            
3
use crate::{
4
    commands::{CommandRequest, RequestParserError, empty_command_response},
5
    request_tokenizer::RequestTokenizer,
6
    types::ChannelName,
7
};
8

            
9
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
10
pub struct SendMessageRequest {
11
    pub channel: ChannelName,
12
    pub message: String,
13
}
14

            
15
impl SendMessageRequest {
16
    pub fn new(channel: ChannelName, message: String) -> Self {
17
        Self { channel, message }
18
    }
19
}
20

            
21
impl CommandRequest for SendMessageRequest {
22
    type Response = SendMessageResponse;
23

            
24
    const COMMAND: &'static str = "sendmessage";
25
    const MIN_ARGS: u32 = 2;
26
    const MAX_ARGS: Option<u32> = None;
27

            
28
    fn serialize(&self) -> String {
29
        format!("{} {} {}", Self::COMMAND, self.channel, self.message)
30
    }
31

            
32
    fn parse(mut parts: RequestTokenizer<'_>) -> Result<Self, RequestParserError> {
33
        let channel = parts.next().ok_or(Self::missing_arguments_error(0))?;
34
        let channel = channel
35
            .parse()
36
            .map_err(|_| RequestParserError::SubtypeParserError {
37
                argument_index: 0,
38
                expected_type: "ChannelName",
39
                raw_input: channel.to_string(),
40
            })?;
41

            
42
        // TODO: SplitWhitespace::remainder() is unstable, use when stable
43
        let message = parts.collect::<Vec<_>>().join(" ");
44

            
45
        Ok(SendMessageRequest { channel, message })
46
    }
47
}
48

            
49
empty_command_response!(SendMessage);