intrepid_core/extract/
message_data.rs

1use bytes::Bytes;
2
3use crate::{Context, Frame};
4
5use super::{Extractor, Message, MessageFrameError};
6
7/// Extract the raw data of a message from a frame. This gives you the
8/// unprocessed data of the message in [`Bytes`] form. Other parts of
9/// the system presume JSON encoding and things like that, but this
10/// will let you determine what format you like.
11#[derive(Debug, Clone, PartialEq, Eq)]
12pub struct MessageData(pub Bytes);
13
14impl<State> Extractor<State> for MessageData {
15    type Error = MessageFrameError;
16
17    fn extract(frame: Frame, context: &Context<State>) -> Result<Self, Self::Error>
18    where
19        Self: Sized,
20    {
21        let Message(message_frame) = Message::extract(frame, context)?;
22
23        Ok(Self(message_frame.data))
24    }
25}
26
27#[test]
28fn raw_message_data() -> Result<(), MessageFrameError> {
29    let frame = Frame::message("/test", vec![1, 2, 3], ());
30    let context = Context::<()>::default();
31    let MessageData(message_data) = MessageData::extract(frame, &context)?;
32
33    assert_eq!(message_data, vec![1, 2, 3]);
34
35    Ok(())
36}
37
38#[test]
39fn failure() -> Result<(), MessageFrameError> {
40    use crate::{Error, ExtractorError};
41
42    let context = Context::<()>::default();
43    let result = MessageData::extract_from_frame_and_state(Frame::default(), &context);
44
45    assert!(matches!(
46        result.unwrap_err(),
47        Error::ExtractorError(ExtractorError::MessageFrameError(
48            MessageFrameError::WrongFrame(_)
49        ))
50    ),);
51
52    Ok(())
53}