ez_bencoding/decode/
int.rs

1use super::{utils::parse_uint, BdecodeResult, IBdecodeNode, token::BdecodeTokenType};
2
3crate::primitive_bdecode_node!(Int);
4
5impl Int {
6    /// 获取当前节点的整数值
7    pub fn value(&self) -> BdecodeResult<i64> {
8        assert!(self.token_type() == BdecodeTokenType::Int);
9
10        let token_idx = self.token_index as usize;
11        let t = &self.tokens[token_idx];
12        let size = self.tokens[token_idx + 1].offset() - t.offset();
13
14        // +1 is to skip the 'i'
15        let start = t.offset() + 1;
16        let mut val = 0;
17        let mut negative = false;
18
19        if  self.buffer[start as usize] == b'-' {
20            negative = true;
21        }
22
23        let end = parse_uint(self.buffer.as_ref(), start as usize, b'e', &mut val)?;
24
25        assert!(end < (start + size) as usize);
26
27        if negative {
28            Ok(-val)
29        } else {
30            Ok(val)
31        }
32    }
33
34    pub fn to_json(&self) -> String {
35        self.value().expect("parse to int failed").to_string()
36    }
37
38}