You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

82 lines
1.8 KiB

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