extern crate serde; extern crate serde_bencode; #[macro_use] extern crate serde_derive; extern crate serde_bytes; use serde_bencode::{de, ser}; use serde_bytes::ByteBuf; #[derive(Debug, Deserialize)] struct Node(String, i64); #[derive(Debug, Serialize, Deserialize)] struct File { path: Vec, length: i64, #[serde(default)] md5sum: Option, } #[derive(Debug, Serialize, Deserialize)] struct Info { name: String, pieces: ByteBuf, #[serde(rename = "piece length")] piece_length: i64, #[serde(default)] md5sum: Option, #[serde(default)] length: Option, #[serde(default)] files: Option>, #[serde(default)] private: Option, #[serde(default)] path: Option>, #[serde(default)] #[serde(rename = "root hash")] root_hash: Option, } #[derive(Debug, Deserialize)] struct Torrent { info: Info, #[serde(default)] announce: Option, #[serde(default)] nodes: Option>, #[serde(default)] encoding: Option, #[serde(default)] httpseeds: Option>, #[serde(default)] #[serde(rename = "announce-list")] announce_list: Option>>, #[serde(default)] #[serde(rename = "creation date")] creation_date: Option, #[serde(rename = "comment")] comment: Option, #[serde(default)] #[serde(rename = "created by")] created_by: Option, } impl Torrent { pub fn open(path: &str) -> Torrent { let b = std::fs::read(path).unwrap(); de::from_bytes::(&b).unwrap() } } #[cfg(test)] mod tests { use super::*; #[test] fn test_read() { let t = Torrent::open("test.torrent"); println!("{:?}", t); } }