torrent-rs/src/lib.rs
src/lib.rsRaw
1extern crate serde;
2extern crate serde_bencode;
3#[macro_use]
4extern crate serde_derive;
5extern crate serde_bytes;
6
7use serde_bencode::{de, ser};
8use serde_bytes::ByteBuf;
9
10#[derive(Debug, Deserialize)]
11struct Node(String, i64);
12
13#[derive(Debug, Serialize, Deserialize)]
14struct File {
15 path: Vec<String>,
16 length: i64,
17 #[serde(default)]
18 md5sum: Option<String>,
19}
20
21#[derive(Debug, Serialize, Deserialize)]
22struct Info {
23 name: String,
24 pieces: ByteBuf,
25 #[serde(rename = "piece length")]
26 piece_length: i64,
27 #[serde(default)]
28 md5sum: Option<String>,
29 #[serde(default)]
30 length: Option<i64>,
31 #[serde(default)]
32 files: Option<Vec<File>>,
33 #[serde(default)]
34 private: Option<u8>,
35 #[serde(default)]
36 path: Option<Vec<String>>,
37 #[serde(default)]
38 #[serde(rename = "root hash")]
39 root_hash: Option<String>,
40}
41
42#[derive(Debug, Deserialize)]
43struct Torrent {
44 info: Info,
45 #[serde(default)]
46 announce: Option<String>,
47 #[serde(default)]
48 nodes: Option<Vec<Node>>,
49 #[serde(default)]
50 encoding: Option<String>,
51 #[serde(default)]
52 httpseeds: Option<Vec<String>>,
53 #[serde(default)]
54 #[serde(rename = "announce-list")]
55 announce_list: Option<Vec<Vec<String>>>,
56 #[serde(default)]
57 #[serde(rename = "creation date")]
58 creation_date: Option<i64>,
59 #[serde(rename = "comment")]
60 comment: Option<String>,
61 #[serde(default)]
62 #[serde(rename = "created by")]
63 created_by: Option<String>,
64}
65
66impl Torrent {
67 pub fn open(path: &str) -> Torrent {
68 let b = std::fs::read(path).unwrap();
69 de::from_bytes::<Torrent>(&b).unwrap()
70 }
71}
72
73#[cfg(test)]
74mod tests {
75 use super::*;
76
77 #[test]
78 fn test_read() {
79 let t = Torrent::open("test.torrent");
80 println!("{:?}", t);
81 }
82}