Lines
82.61 %
Functions
33.33 %
use serde::{Deserialize, Serialize};
use crate::{
commands::{CommandResponse, ResponseParserError, empty_command_request},
response_tokenizer::{ResponseAttributes, expect_property_type},
types::ChannelName,
};
empty_command_request!(ReadMessages, "readmessages");
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ReadMessagesResponse(Vec<ReadMessagesResponseEntry>);
impl ReadMessagesResponse {
pub fn new(entries: Vec<ReadMessagesResponseEntry>) -> Self {
ReadMessagesResponse(entries)
}
pub struct ReadMessagesResponseEntry {
channel: ChannelName,
message: String,
impl ReadMessagesResponseEntry {
pub fn new(channel: ChannelName, message: String) -> Self {
ReadMessagesResponseEntry { channel, message }
impl CommandResponse for ReadMessagesResponse {
type Request = ReadMessagesRequest;
fn parse(parts: ResponseAttributes<'_>) -> Result<Self, ResponseParserError> {
let parts: Vec<_> = parts.into_vec()?;
debug_assert!(parts.len() % 2 == 0);
let mut messages = Vec::with_capacity(parts.len() / 2);
for channel_message_pair in parts.chunks_exact(2) {
let (ckey, cvalue) = channel_message_pair[0];
let (mkey, mvalue) = channel_message_pair[1];
debug_assert!(ckey == "channel");
debug_assert!(mkey == "message");
let channel = expect_property_type!(Some(cvalue), "channel", Text);
let channel = channel
.parse()
.map_err(|_| ResponseParserError::SyntaxError(0, channel.to_string()))?;
let message = expect_property_type!(Some(mvalue), "message", Text).to_string();
messages.push(ReadMessagesResponseEntry { channel, message });
Ok(ReadMessagesResponse(messages))
fn serialize(&self) -> Vec<u8> {
unimplemented!("response serialization is not yet implemented for ReadMessagesResponse")
#[cfg(test)]
mod tests {
use indoc::indoc;
use super::*;
#[test]
fn test_parse_response() {
let input = indoc! {"
channel: channel1
message: message1
channel: channel2
message: message2
OK
"};
let result = ReadMessagesResponse::parse_raw(input.as_bytes());
assert_eq!(
result,
Ok(ReadMessagesResponse(vec![
ReadMessagesResponseEntry {
channel: "channel1".parse().unwrap(),
message: "message1".to_string(),
},
channel: "channel2".parse().unwrap(),
message: "message2".to_string(),
]))
);