rabbitmq_stream_protocol/commands/
generic.rs

1use std::io::Write;
2
3use crate::{
4    codec::{Decoder, Encoder},
5    error::{DecodeError, EncodeError},
6    FromResponse, ResponseCode, ResponseKind,
7};
8
9#[cfg_attr(test, derive(fake::Dummy))]
10#[derive(PartialEq, Eq, Debug)]
11pub struct GenericResponse {
12    pub(crate) correlation_id: u32,
13    code: ResponseCode,
14}
15
16impl GenericResponse {
17    /// Get a reference to the generic response's code.
18    pub fn code(&self) -> &ResponseCode {
19        &self.code
20    }
21
22    pub fn is_ok(&self) -> bool {
23        self.code == ResponseCode::Ok
24    }
25}
26
27impl Encoder for GenericResponse {
28    fn encoded_size(&self) -> u32 {
29        self.correlation_id.encoded_size() + self.code.encoded_size()
30    }
31
32    fn encode(&self, writer: &mut impl Write) -> Result<(), EncodeError> {
33        self.correlation_id.encode(writer)?;
34        self.code.encode(writer)?;
35        Ok(())
36    }
37}
38
39impl Decoder for GenericResponse {
40    fn decode(input: &[u8]) -> Result<(&[u8], Self), DecodeError> {
41        let (input, correlation_id) = u32::decode(input)?;
42        let (input, code) = ResponseCode::decode(input)?;
43
44        Ok((
45            input,
46            GenericResponse {
47                correlation_id,
48                code,
49            },
50        ))
51    }
52}
53
54impl FromResponse for GenericResponse {
55    fn from_response(response: crate::Response) -> Option<Self> {
56        match response.kind {
57            ResponseKind::Generic(generic) => Some(generic),
58            _ => None,
59        }
60    }
61}
62
63#[cfg(test)]
64mod tests {
65
66    use crate::commands::tests::command_encode_decode_test;
67
68    use super::GenericResponse;
69
70    #[test]
71    fn sasl_authenticate_request_test() {
72        command_encode_decode_test::<GenericResponse>()
73    }
74}