print_torrent/
print_torrent.rs

1extern crate lazy_bencoding;
2
3use std::env;
4use std::fs::File;
5use std::io::Read;
6
7use lazy_bencoding::*;
8
9fn pretty_print<'a>(bencoded: BEncoded<'a>, padding: &str) {
10    if let Some(s) = bencoded.get_utf8_string() {
11        println!("{}{}", padding, s);
12    } else if let Some(bs) = bencoded.get_byte_string() {
13        // Hexdump
14        let mut line = String::new();
15        for (i, b) in bs.iter().enumerate() {
16            line.push_str(&format!("{:02X}", b));
17            if i & 15 == 0 {
18                println!("{}{}", padding, line);
19                line.clear();
20            } else if i & 7 == 0 {
21                line.push_str("   ");
22            } else if i & 3 == 0 {
23                line.push_str("  ");
24            } else {
25                line.push_str(" ");
26            }
27        }
28        if line.len() > 0 {
29            println!("{}{}", padding, line);
30        }
31    } else if let Some(i) = bencoded.get_integer() {
32        println!("{}{}", padding, i);
33    } else if bencoded.is_dict() {
34        for (key, value) in bencoded.dict() {
35            if let Some(key) = key.get_utf8_string() {
36                println!("{}{}:", padding, key);
37            } else {
38                pretty_print(key, padding);
39            }
40            pretty_print(value, &format!("{}    ", padding));
41        }
42    } else if bencoded.is_list() {
43        for (i, elem) in bencoded.list().enumerate() {
44            let padding = if i == 0 {
45                format!("{}  - ", padding)
46            } else {
47                let space_padding: String = padding.chars()
48                    .map(|c| ' ').collect();
49                format!("{}  - ", space_padding)
50            };
51            pretty_print(elem, &padding);
52        }
53    } else {
54        println!("{}Weird tokens: {:?}", padding, bencoded.collect::<Vec<Token<'a>>>());
55    }
56}
57
58fn main() {
59    for filename in env::args().skip(1) {
60        let mut f = match File::open(&filename) {
61            Ok(f) => f,
62            Err(e) => {
63                println!("{}: {:?}", filename, e);
64                continue;
65            }
66        };
67        let mut contents = Vec::new();
68        f.read_to_end(&mut contents).unwrap();
69
70        let bencoded = BEncoded::new(&contents[..]);
71        pretty_print(bencoded, "");
72    }
73}