ez_bencoding/decode/
list.rs1use 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 pub fn item(&self, index: usize) -> BdecodeNode {
13 assert!(self.token_type() == BdecodeTokenType::List);
14
15 if index >= self.len() {
16 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}