refactor and simplify the bencode objects

This commit is contained in:
2016-12-11 22:00:31 -05:00
parent 881c1e2b01
commit 72d4dfc0b8
4 changed files with 171 additions and 88 deletions

View File

@@ -24,7 +24,8 @@ pub struct Metainfo {
}
impl Metainfo {
pub fn from_bencode(obj: Object) -> Option<Metainfo> {
pub fn from_bencode<O>(obj: O) -> Option<Metainfo> where O: Into<Object> {
let obj = obj.into();
let metainfo = ts!(obj.as_dict());
let info = ts!(metainfo.get_dict("info"));
@@ -106,23 +107,23 @@ fn piece_from_slice(src: &[u8]) -> [u8; 20] {
mod tests {
use std::path::Path;
use bencode::{Bytes, Dict, List, Object};
use bencode::{Dict, List, Object};
use metainfo::Metainfo;
#[test]
fn test_single_file() {
let mut meta = Dict::new();
meta.insert(Bytes::new("announce"), Bytes::wrap("http://ubuntu.com/tracker:6969"));
meta.insert("announce", "http://ubuntu.com/tracker:6969");
let mut info = Dict::new();
info.insert(Bytes::new("name"), Bytes::wrap("ubuntu-16.04-desktop.iso"));
info.insert(Bytes::new("length"), Object::Int(1024 * 1024 * 1024));
info.insert(Bytes::new("piece length"), Object::Int(1024 * 512));
info.insert(Bytes::new("pieces"), Bytes::wrap(""));
info.insert("name", "ubuntu-16.04-desktop.iso");
info.insert("length", 1024 * 1024 * 1024);
info.insert("piece length", 1024 * 512);
info.insert("pieces", "");
meta.insert(Bytes::new("info"), Object::Dict(info));
meta.insert("info", info);
let metainfo = Metainfo::from_bencode(Object::Dict(meta)).unwrap();
let metainfo = Metainfo::from_bencode(meta).unwrap();
assert_eq!(metainfo.announce, "http://ubuntu.com/tracker:6969");
assert_eq!(metainfo.piece_length, 1024 * 512);
@@ -134,27 +135,27 @@ mod tests {
#[test]
fn test_multiple_files() {
let mut meta = Dict::new();
meta.insert(Bytes::new("announce"), Bytes::wrap("http://ubuntu.com/tracker:6969"));
meta.insert("announce", "http://ubuntu.com/tracker:6969");
let mut info = Dict::new();
info.insert(Bytes::new("name"), Bytes::wrap("base_folder"));
info.insert(Bytes::new("piece length"), Object::Int(1024 * 512));
info.insert(Bytes::new("pieces"), Bytes::wrap(""));
info.insert("name", "base_folder");
info.insert("piece length", 1024 * 512);
info.insert("pieces", "");
let mut files = List::new();
let mut file1 = Dict::new();
file1.insert(Bytes::new("path"), List::wrap(vec![Bytes::wrap("folder2"), Bytes::wrap("image.txt")]));
file1.insert(Bytes::new("length"), Object::Int(512));
files.push(Object::Dict(file1));
file1.insert("path", vec!["folder2", "image.txt"]);
file1.insert("length", 512);
files.push(file1);
let mut file2 = Dict::new();
file2.insert(Bytes::new("path"), List::wrap(vec![Bytes::wrap("txt.jpg")]));
file2.insert(Bytes::new("length"), Object::Int(64));
files.push(Object::Dict(file2));
info.insert(Bytes::new("files"), Object::List(files));
file2.insert("path", vec!["txt.jpg"]);
file2.insert("length", 64);
files.push(file2);
info.insert("files", Object::List(files));
meta.insert(Bytes::new("info"), Object::Dict(info));
meta.insert("info", info);
let metainfo = Metainfo::from_bencode(Object::Dict(meta)).unwrap();
let metainfo = Metainfo::from_bencode(meta).unwrap();
assert_eq!(metainfo.announce, "http://ubuntu.com/tracker:6969");
assert_eq!(metainfo.piece_length, 1024 * 512);