refactor and simplify the bencode objects
This commit is contained in:
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user