1mod de;
7mod error;
8mod parser;
9mod ser;
10mod value;
11
12pub use de::{Deserializer, from_bytes, from_bytes_lenient};
13pub use error::{Error, Result};
14pub use parser::{parse, parse_lenient};
15pub use ser::{Serializer, to_bytes};
16pub use value::Value;
17
18#[cfg(test)]
19mod tests {
20 use bytes::Bytes;
21 use hex_literal::hex;
22 use serde::{Deserialize, Serialize};
23 use std::fs::File;
24 use std::io::Read;
25
26 #[derive(Eq, PartialEq, Debug, Serialize, Deserialize)]
27 pub struct Metainfo {
28 pub announce: String,
29 pub info: Info,
30 }
31
32 #[derive(Eq, PartialEq, Debug, Serialize, Deserialize)]
33 pub struct Info {
34 pub length: Option<u64>,
35 pub name: String,
36 pub files: Option<Vec<FileInfo>>,
37
38 #[serde(rename = "piece length")]
39 pub piece_length: u32,
40
41 pub pieces: Bytes,
42 }
43
44 #[derive(Eq, PartialEq, Clone, Debug, Serialize, Deserialize)]
45 pub struct FileInfo {
46 pub length: u64,
47 pub path: Vec<String>,
48 }
49
50 pub fn read_torrent_file() -> Vec<u8> {
51 let mut file = File::open("test-data/test.torrent").unwrap();
52 let mut contents = vec![];
53 file.read_to_end(&mut contents).unwrap();
54 contents
55 }
56
57 pub fn make_metainfo() -> Metainfo {
58 Metainfo {
59 announce: String::from("http://example.org/announce"),
60 info: Info {
61 length: None,
62 name: String::from("test"),
63 files: Some(vec![
64 FileInfo {
65 length: 5120,
66 path: vec![String::from("file0")],
67 },
68 FileInfo {
69 length: 2048,
70 path: vec![String::from("foo"), String::from("file1")],
71 },
72 ]),
73 piece_length: 1024,
74 pieces: Bytes::from_static(&hex!(
75 "2d099e1cae6a61330622090d6f94c58aaf5db24e2d099e1cae6a61330622090d6f94c58aaf5db24e2d099e1cae6a61330622090d6f94c58aaf5db24e2d099e1cae6a61330622090d6f94c58aaf5db24e2d099e1cae6a61330622090d6f94c58aaf5db24ed7d891f0200cb89648beea3c30f6df45832214acd7d891f0200cb89648beea3c30f6df45832214ac"
76 )),
77 },
78 }
79 }
80}