ez_bencoding/decode/
list.rs

1use std::borrow::Cow;
2
3use crate::decode::token::BdecodeTokenType;
4
5use super::{BdecodeNode, BdecodeResult, IBdecodeNode};
6
7crate::collective_bdecode_node!(List);
8
9impl List {
10
11    /// 获取 list 中指定索引的节点
12    pub fn item(&self, index: usize) -> BdecodeNode {
13        assert!(self.token_type() == BdecodeTokenType::List);
14
15        if index >= self.len() {
16            // println!("index: {}, len: {}", index, self.len());
17            panic!("index out of range");
18        }
19
20        let token_idx = self.item_indexes[index];
21        BdecodeNode::new(token_idx, self.tokens.clone(), self.buffer.clone())
22    }
23
24    pub fn as_int(&self, index: usize) -> BdecodeResult<i64> {
25        self.item(index).as_int()
26    }
27
28    pub fn as_str(&self, index: usize) -> Cow<[u8]> {
29        let node = self.item(index);
30        let val = node.as_str();
31
32        let val_ptr = val.as_ref() as *const [u8];
33        let val_ref = unsafe { &*val_ptr };
34
35        Cow::Borrowed(val_ref)
36    }
37
38    pub fn to_json(&self) -> String {
39        let mut sb = String::new();
40        let len = self.len();
41
42        for i in 0..len {
43            let val = self.item(i);
44            sb.push_str(&val.to_json());
45
46            if i < len - 1 { 
47                sb.push_str(", "); 
48            }
49        }
50        
51        format!("[{}]", sb)
52    }
53}