rsrs_core/frame/
ext.rs

1use recode::bytes::BytesMut;
2use recode::codec::*;
3
4use super::validators::non_zero;
5use crate::{frame, FrameFlags};
6
7frame! {
8    /// EXT (Extension) Frame (0x3F)
9    ///
10    /// The general format for an extension frame is given below.
11    ///
12    /// # Frame Contents
13    ///
14    /// ```text
15    ///  0                   1                   2                   3
16    ///  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
17    /// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
18    /// |                           Stream ID                           |
19    /// +-----------+-+-+---------------+-------------------------------+
20    /// |Frame Type |I|M|    Flags      |
21    /// +-------------------------------+-------------------------------+
22    /// |0|                      Extended Type                          |
23    /// +---------------------------------------------------------------+
24    ///                      Depends on Extended Type...
25    /// ```
26    Ext [header] {
27        #mask     = [IGNORE | METADATA];
28
29        /// Extended Type
30        ///
31        /// Unsigned 31-bit integer of Extended type information.
32        /// Value **MUST** be > 0.
33        @validate(r#"|v, b| non_zero("Ext.extended_type", v, b)"#);
34        pub extended_type(required): u32;
35
36        /// Extended Payload Metadata
37        @skip_if("!header.has(FrameFlags::METADATA)");
38        @with("LengthPrefixed::<u24>");
39        pub metadata: BytesMut => [ set (METADATA if !metadata.is_empty()) ];
40
41        /// Extended Payload Data
42        @with("Unprefixed");
43        pub data: BytesMut;
44    }
45}