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

            
3
use crate::{
4
    commands::{CommandResponse, ResponseParserError, empty_command_request},
5
    response_tokenizer::{ResponseAttributes, expect_property_type},
6
    types::ChannelName,
7
};
8

            
9
empty_command_request!(ReadMessages, "readmessages");
10

            
11
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
12
pub struct ReadMessagesResponse(Vec<ReadMessagesResponseEntry>);
13

            
14
impl ReadMessagesResponse {
15
    pub fn new(entries: Vec<ReadMessagesResponseEntry>) -> Self {
16
        ReadMessagesResponse(entries)
17
    }
18
}
19

            
20
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
21
pub struct ReadMessagesResponseEntry {
22
    channel: ChannelName,
23
    message: String,
24
}
25

            
26
impl ReadMessagesResponseEntry {
27
    pub fn new(channel: ChannelName, message: String) -> Self {
28
        ReadMessagesResponseEntry { channel, message }
29
    }
30
}
31

            
32
impl CommandResponse for ReadMessagesResponse {
33
    type Request = ReadMessagesRequest;
34

            
35
1
    fn parse(parts: ResponseAttributes<'_>) -> Result<Self, ResponseParserError> {
36
1
        let parts: Vec<_> = parts.into_vec()?;
37
1
        debug_assert!(parts.len() % 2 == 0);
38

            
39
1
        let mut messages = Vec::with_capacity(parts.len() / 2);
40

            
41
2
        for channel_message_pair in parts.chunks_exact(2) {
42
2
            let (ckey, cvalue) = channel_message_pair[0];
43
2
            let (mkey, mvalue) = channel_message_pair[1];
44

            
45
2
            debug_assert!(ckey == "channel");
46
2
            debug_assert!(mkey == "message");
47

            
48
2
            let channel = expect_property_type!(Some(cvalue), "channel", Text);
49
2
            let channel = channel
50
2
                .parse()
51
2
                .map_err(|_| ResponseParserError::SyntaxError(0, channel.to_string()))?;
52

            
53
2
            let message = expect_property_type!(Some(mvalue), "message", Text).to_string();
54

            
55
2
            messages.push(ReadMessagesResponseEntry { channel, message });
56
        }
57

            
58
1
        Ok(ReadMessagesResponse(messages))
59
1
    }
60

            
61
    fn serialize(&self) -> Vec<u8> {
62
        unimplemented!("response serialization is not yet implemented for ReadMessagesResponse")
63
    }
64
}
65

            
66
#[cfg(test)]
67
mod tests {
68
    use indoc::indoc;
69

            
70
    use super::*;
71

            
72
    #[test]
73
1
    fn test_parse_response() {
74
1
        let input = indoc! {"
75
1
            channel: channel1
76
1
            message: message1
77
1
            channel: channel2
78
1
            message: message2
79
1
            OK
80
1
        "};
81
1
        let result = ReadMessagesResponse::parse_raw(input.as_bytes());
82
1
        assert_eq!(
83
            result,
84
1
            Ok(ReadMessagesResponse(vec![
85
1
                ReadMessagesResponseEntry {
86
1
                    channel: "channel1".parse().unwrap(),
87
1
                    message: "message1".to_string(),
88
1
                },
89
1
                ReadMessagesResponseEntry {
90
1
                    channel: "channel2".parse().unwrap(),
91
1
                    message: "message2".to_string(),
92
1
                },
93
1
            ]))
94
        );
95
1
    }
96
}