print_torrent/
print_torrent.rs1extern 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 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}