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}