metalmq-codec 0.3.0

MetalMQ codec library
Documentation
use bytes::BytesMut;
use metalmq_codec::codec::{AMQPCodec, Frame};
use metalmq_codec::frame::{self, AMQPFrame};
use tokio_util::codec::{Decoder, Encoder};

macro_rules! extract_method_frame_args {
    ( $name:ident, $frame:expr ) => {
        match $frame {
            Frame::Frame(sf) => match sf {
                AMQPFrame::Method(_, _, mf) => match mf {
                    frame::MethodFrameArgs::$name(args) => args,
                    _ => panic!("{:?} is not of the correct type", mf),
                },
                _ => panic!("{:?} is not a method frame", sf),
            },
            _ => panic!("It is not a single frame"),
        }
    };
}

#[test]
fn queue_purge() {
    let mut codec = AMQPCodec {};
    let mut buf = BytesMut::with_capacity(128);

    let fr = frame::QueuePurgeArgs::default().queue_name("test-queue").frame(2);
    assert!(codec.encode(Frame::Frame(fr), &mut buf).is_ok());

    let res = codec.decode(&mut buf);
    assert!(res.is_ok());

    let maybe_frame = res.unwrap();
    assert!(maybe_frame.is_some());

    let purge_frame = maybe_frame.unwrap();
    let args = extract_method_frame_args!(QueuePurge, purge_frame);
    assert_eq!(args.queue_name, "test-queue");
}