intrepid_core/extract/
message_meta.rs

1use bytes::Bytes;
2
3use crate::{Context, Frame};
4
5use super::{Extractor, Message, MessageFrameError};
6
7/// Extract the raw metadata of a message from a frame. This gives you the
8/// unprocessed metadata 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 MessageMeta(pub Bytes);
13
14impl<State> Extractor<State> for MessageMeta {
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.meta))
24    }
25}
26
27#[test]
28fn raw_message_meta() -> Result<(), MessageFrameError> {
29    let frame = Frame::message("/test", (), "42".to_string());
30    let context = Context::<()>::default();
31    let MessageMeta(message_meta) = MessageMeta::extract(frame, &context)?;
32
33    assert_eq!(message_meta, Bytes::from("42".to_string()));
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 = MessageMeta::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}