ez_bencoding/decode/
macros.rs

1
2#[macro_export]
3macro_rules! primitive_bdecode_node {
4    ($node_name:ident) => {
5        #[derive(Debug, Clone)]
6        pub struct $node_name {
7            /// 当前节点在 tokens 中的索引
8            /// 0 - root 节点值; -1 - 未初始化
9            pub token_index: u32,
10
11            /// 解析后的 token 集合
12            pub tokens: std::sync::Arc<Vec<super::token::BdecodeToken>>,
13
14            /// 存放解析前字符串的 buffer
15            pub buffer: std::sync::Arc<Vec<u8>>,
16        }
17
18        impl $node_name {
19            pub fn new(
20                buffer: std::sync::Arc<Vec<u8>>,
21                tokens: std::sync::Arc<Vec<super::token::BdecodeToken>>,
22                token_index: u32,
23            ) -> Self {
24                Self {
25                    buffer,
26                    tokens,
27                    token_index,
28                }
29            }
30        }
31
32        impl super::IBdecodeNode for $node_name {
33            fn token_index(&self) -> usize {
34                self.token_index as usize
35            }
36
37            fn tokens(&self) -> std::sync::Arc<Vec<super::token::BdecodeToken>> {
38                self.tokens.clone()
39            }
40        }
41    };
42}
43
44#[macro_export]
45macro_rules! collective_bdecode_node {
46    ($node_name:ident) => {
47        #[derive(Debug, Clone)]
48        pub struct $node_name {
49            /// 当前节点在 tokens 中的索引
50            /// 0 - root 节点值; -1 - 未初始化
51            pub token_index: u32,
52
53            /// 解析后的 token 集合
54            pub tokens: std::sync::Arc<Vec<super::token::BdecodeToken>>,
55
56            /// 存放解析前字符串的 buffer
57            pub buffer: std::sync::Arc<Vec<u8>>,
58
59            /// 存放 list 和 map 中 item 的对应的 token 索引集合
60            pub item_indexes: std::sync::Arc<Vec<u32>>,
61            // pub item_begin_len: Option<(u32, u32)>,
62
63            /// list 和 map 中 item 的数量
64            len: usize,
65        }
66
67        impl $node_name {
68            pub fn new(
69                buffer: std::sync::Arc<Vec<u8>>,
70                tokens: std::sync::Arc<Vec<super::token::BdecodeToken>>,
71                token_index: u32,
72                item_indexes: std::sync::Arc<Vec<u32>>,
73                len: usize,
74            ) -> Self {
75                Self {
76                    buffer,
77                    tokens,
78                    token_index,
79                    item_indexes,
80                    len,
81                }
82            }
83
84            /// 获取当前 list or dict 节点的长度
85            pub fn len(&self) -> usize {
86                use crate::IBdecodeNode;
87                use super::token::BdecodeTokenType::*;
88
89                assert!(matches!(self.token_type(), Dict | List));
90
91                self.len
92            }
93        }
94
95        impl super::IBdecodeNode for $node_name {
96            fn token_index(&self) -> usize {
97                self.token_index as usize
98            }
99
100            fn tokens(&self) -> std::sync::Arc<Vec<super::token::BdecodeToken>> {
101                self.tokens.clone()
102            }
103        }
104    }
105}