arnaucube
arnaucube/torrent-rsPublic Self-hosted repository
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}