Skip to main content

bside/
lib.rs

1//! [bside](https://codeberg.org/benjamingeer/bside) is a
2//! [Bencode](https://en.wikipedia.org/wiki/Bencode) parser based on
3//! [nom](https://docs.rs/nom), with support for [Serde](https://serde.rs)
4//! serialization and deserialization.
5
6mod 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}