Skip to content

Commit 5f6e57c

Browse files
reeFridgeGGist
authored andcommitted
Fixed setters of MetainfoBuilder (#144)
* Use if-let expressions instead of combinators in MetainfoBuilder setters * Added getters for same setters * Added tests for builder's setters/getters * Use parse functions for parsing keys + added getter for tracker-list * Added test for set_trackers method * Replaced and_then-or by single map in getters * self as ref in getters
1 parent ccae74b commit 5f6e57c

File tree

2 files changed

+114
-15
lines changed

2 files changed

+114
-15
lines changed

bip_metainfo/src/builder/mod.rs

+62-15
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use std::iter::ExactSizeIterator;
22

3-
use bip_bencode::{BencodeMut, BMutAccess};
3+
use bip_bencode::{BencodeMut, BMutAccess, BRefAccess};
44
use bip_util::sha::{self, ShaHash};
55

66
use accessor::{Accessor, IntoAccessor};
@@ -103,9 +103,12 @@ impl<'a> MetainfoBuilder<'a> {
103103
pub fn set_main_tracker(mut self, opt_tracker_url: Option<&'a str>) -> MetainfoBuilder<'a> {
104104
{
105105
let dict_access = self.root.dict_mut().unwrap();
106-
opt_tracker_url
107-
.and_then(|tracker_url| dict_access.insert(parse::ANNOUNCE_URL_KEY.into(), ben_bytes!(tracker_url)))
108-
.or_else(|| dict_access.remove(parse::ANNOUNCE_URL_KEY));
106+
107+
if let Some(tracker_url) = opt_tracker_url {
108+
dict_access.insert(parse::ANNOUNCE_URL_KEY.into(), ben_bytes!(tracker_url));
109+
} else {
110+
dict_access.remove(parse::ANNOUNCE_URL_KEY);
111+
}
109112
}
110113

111114
self
@@ -115,9 +118,12 @@ impl<'a> MetainfoBuilder<'a> {
115118
pub fn set_creation_date(mut self, opt_secs_epoch: Option<i64>) -> MetainfoBuilder<'a> {
116119
{
117120
let dict_access = self.root.dict_mut().unwrap();
118-
opt_secs_epoch
119-
.and_then(|secs_epoch| dict_access.insert(parse::CREATION_DATE_KEY.into(), ben_int!(secs_epoch)))
120-
.or_else(|| dict_access.remove(parse::CREATION_DATE_KEY));
121+
122+
if let Some(secs_epoch) = opt_secs_epoch {
123+
dict_access.insert(parse::CREATION_DATE_KEY.into(), ben_int!(secs_epoch));
124+
} else {
125+
dict_access.remove(parse::CREATION_DATE_KEY);
126+
}
121127
}
122128

123129
self
@@ -127,9 +133,12 @@ impl<'a> MetainfoBuilder<'a> {
127133
pub fn set_comment(mut self, opt_comment: Option<&'a str>) -> MetainfoBuilder<'a> {
128134
{
129135
let dict_access = self.root.dict_mut().unwrap();
130-
opt_comment
131-
.and_then(|comment| dict_access.insert(parse::COMMENT_KEY.into(), ben_bytes!(comment)))
132-
.or_else(|| dict_access.remove(parse::COMMENT_KEY));
136+
137+
if let Some(comment) = opt_comment {
138+
dict_access.insert(parse::COMMENT_KEY.into(), ben_bytes!(comment));
139+
} else {
140+
dict_access.remove(parse::COMMENT_KEY);
141+
}
133142
}
134143

135144
self
@@ -139,9 +148,12 @@ impl<'a> MetainfoBuilder<'a> {
139148
pub fn set_created_by(mut self, opt_created_by: Option<&'a str>) -> MetainfoBuilder<'a> {
140149
{
141150
let dict_access = self.root.dict_mut().unwrap();
142-
opt_created_by
143-
.and_then(|created_by| dict_access.insert(parse::CREATED_BY_KEY.into(), ben_bytes!(created_by)))
144-
.or_else(|| dict_access.remove(parse::CREATED_BY_KEY));
151+
152+
if let Some(created_by) = opt_created_by {
153+
dict_access.insert(parse::CREATED_BY_KEY.into(), ben_bytes!(created_by));
154+
} else {
155+
dict_access.remove(parse::CREATED_BY_KEY);
156+
}
145157
}
146158

147159
self
@@ -161,6 +173,41 @@ impl<'a> MetainfoBuilder<'a> {
161173
self
162174
}
163175

176+
/// Get decoded value of announce-list key
177+
pub fn get_trackers(&self) -> Option<Vec<Vec<String>>> {
178+
let dict_access = self.root.dict().unwrap();
179+
180+
parse::parse_announce_list(dict_access).map(parse::convert_announce_list)
181+
}
182+
183+
/// Get decoded value of announce-url key
184+
pub fn get_main_tracker(&self) -> Option<String> {
185+
let dict_access = self.root.dict().unwrap();
186+
187+
parse::parse_announce_url(dict_access).map(String::from)
188+
}
189+
190+
/// Get decoded value of creation-date key
191+
pub fn get_creation_date(&self) -> Option<i64> {
192+
let dict_access = self.root.dict().unwrap();
193+
194+
parse::parse_creation_date(dict_access)
195+
}
196+
197+
/// Get decoded value of comment key
198+
pub fn get_comment(&self) -> Option<String> {
199+
let dict_access = self.root.dict().unwrap();
200+
201+
parse::parse_comment(dict_access).map(String::from)
202+
}
203+
204+
/// Get decoded value of created-by key
205+
pub fn get_created_by(&self) -> Option<String> {
206+
let dict_access = self.root.dict().unwrap();
207+
208+
parse::parse_created_by(dict_access).map(String::from)
209+
}
210+
164211
/// Build the metainfo file from the given accessor and the number of worker threads.
165212
///
166213
/// Panics if threads is equal to zero.
@@ -192,7 +239,7 @@ impl<'a> InfoBuilder<'a> {
192239
/// Set or unset the private flag for the torrent file.
193240
pub fn set_private_flag(mut self, opt_is_private: Option<bool>) -> InfoBuilder<'a> {
194241
let opt_numeric_is_private = opt_is_private.map(|is_private| if is_private{ 1 } else { 0 });
195-
242+
196243
{
197244
let dict_access = self.info.dict_mut().unwrap();
198245
opt_numeric_is_private
@@ -236,7 +283,7 @@ fn build_with_accessor<'a, A, C>(threads: usize,
236283
if threads == 0 {
237284
panic!("bip_metainfo: Cannot Build Metainfo File With threads == 0");
238285
}
239-
286+
240287
// Collect all of the file information into a list
241288
let mut files_info = Vec::new();
242289
try!(accessor.access_metadata(|len, path| {

bip_metainfo/tests/test_builder.rs

+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
extern crate bip_metainfo;
2+
3+
use bip_metainfo::MetainfoBuilder;
4+
5+
const TRACKER: &'static str = "udp://foo.bar.baz:6969";
6+
const DATE: i64 = 1517651523851;
7+
const COMMENT: &'static str = "Foo bar baz";
8+
const CREATED_BY: &'static str = "Fridge";
9+
10+
#[test]
11+
fn positive_set_trackers() {
12+
let trackers = vec![
13+
vec![TRACKER.to_string()]
14+
];
15+
16+
let builder = MetainfoBuilder::new()
17+
.set_trackers(Some(&trackers));
18+
19+
assert_eq!(builder.get_trackers(), Some(trackers.clone()));
20+
}
21+
22+
#[test]
23+
fn positive_set_main_tracker() {
24+
let builder = MetainfoBuilder::new()
25+
.set_main_tracker(Some(TRACKER));
26+
27+
assert_eq!(builder.get_main_tracker(), Some(TRACKER.to_string()));
28+
}
29+
30+
#[test]
31+
fn positive_set_creation_date() {
32+
let builder = MetainfoBuilder::new()
33+
.set_creation_date(Some(DATE));
34+
35+
assert_eq!(builder.get_creation_date(), Some(DATE));
36+
}
37+
38+
#[test]
39+
fn positive_set_comment() {
40+
let builder = MetainfoBuilder::new()
41+
.set_comment(Some(COMMENT));
42+
43+
assert_eq!(builder.get_comment(), Some(COMMENT.to_string()));
44+
}
45+
46+
#[test]
47+
fn positive_set_created_by() {
48+
let builder = MetainfoBuilder::new()
49+
.set_created_by(Some(CREATED_BY));
50+
51+
assert_eq!(builder.get_created_by(), Some(CREATED_BY.to_string()));
52+
}

0 commit comments

Comments
 (0)