1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
//! Library for parsing and building metainfo files.
//!
//! # Examples
//!
//! Building and parsing a metainfo file from a directory:
//!
//! ```rust
//!     extern crate bip_metainfo;
//!
//!     use bip_metainfo::{MetainfoBuilder, Metainfo};
//!
//!     fn main() {
//!         let builder = MetainfoBuilder::new()
//!             .set_created_by(Some("bip_metainfo example"))
//!             .set_comment(Some("Metainfo File From A File"));
//!
//!         // Build the file from the crate's src folder
//!         let bytes = builder.build(1, "src", |progress| {
//!             // Progress Is A Value Between 0.0 And 1.0
//!             assert!(progress <= 1.0f64);
//!         }).unwrap();
//!         let file = Metainfo::from_bytes(&bytes).unwrap();
//!
//!         assert_eq!(file.info().directory(), Some("src".as_ref()));
//!     }
//! ```
//!
//! Building and parsing a metainfo file from direct data:
//!
//! ```rust
//!     extern crate bip_metainfo;
//!
//!     use bip_metainfo::{MetainfoBuilder, Metainfo, DirectAccessor};
//!
//!     fn main() {
//!         let builder = MetainfoBuilder::new()
//!             .set_created_by(Some("bip_metainfo example"))
//!             .set_comment(Some("Metainfo File From A File"));
//!
//!         let file_name = "FileName.txt";
//!         let file_data = b"This is our file data, it is already in memory!!!";
//!         let accessor = DirectAccessor::new(file_name, file_data);
//!
//!         // Build the file from some data that is already in memory
//!         let bytes = builder.build(1, accessor, |progress| {
//!             // Progress Is A Value Between 0.0 And 1.0
//!             assert!(progress <= 1.0f64);
//!         }).unwrap();
//!         let file = Metainfo::from_bytes(&bytes).unwrap();
//!
//!         assert_eq!(file.info().directory(), None);
//!         assert_eq!(file.info().files().count(), 1);
//!
//!         let single_file = file.info().files().next().unwrap();
//!         assert_eq!(single_file.length() as usize, file_data.len());
//!         assert_eq!(single_file.path().iter().count(), 1);
//!         assert_eq!(single_file.path().to_str().unwrap(), file_name);
//!     }
//! ```

#[macro_use]
extern crate bip_bencode;
extern crate bip_util;
extern crate crossbeam;
extern crate walkdir;
#[macro_use]
extern crate error_chain;

#[cfg(test)]
extern crate rand;

mod accessor;
mod builder;
pub mod error;
mod metainfo;
mod parse;

pub mod iter;

pub use bip_util::bt::InfoHash;

pub use accessor::{Accessor, IntoAccessor, DirectAccessor, FileAccessor, PieceAccess};
pub use builder::{MetainfoBuilder, PieceLength, InfoBuilder};
pub use metainfo::{Info, Metainfo, File};