ez_bencoding/decode/
macros.rs1
2#[macro_export]
3macro_rules! primitive_bdecode_node {
4 ($node_name:ident) => {
5 #[derive(Debug, Clone)]
6 pub struct $node_name {
7 pub token_index: u32,
10
11 pub tokens: std::sync::Arc<Vec<super::token::BdecodeToken>>,
13
14 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 pub token_index: u32,
52
53 pub tokens: std::sync::Arc<Vec<super::token::BdecodeToken>>,
55
56 pub buffer: std::sync::Arc<Vec<u8>>,
58
59 pub item_indexes: std::sync::Arc<Vec<u32>>,
61 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 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}