ez_bencoding/decode/
int.rs1use super::{utils::parse_uint, BdecodeResult, IBdecodeNode, token::BdecodeTokenType};
2
3crate::primitive_bdecode_node!(Int);
4
5impl Int {
6 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 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}