torrust_tracker_contrib_bencode/
lib.rs

1//! Library for parsing and converting bencoded data.
2//!
3//! # Examples
4//!
5//! Decoding bencoded data:
6//!
7//! ```rust
8//!     extern crate bencode;
9//!
10//!     use bencode::{BencodeRef, BRefAccess, BDecodeOpt};
11//!
12//!     fn main() {
13//!         let data = b"d12:lucky_numberi7ee"; // cspell:disable-line
14//!         let bencode = BencodeRef::decode(data, BDecodeOpt::default()).unwrap();
15//!
16//!         assert_eq!(7, bencode.dict().unwrap().lookup("lucky_number".as_bytes())
17//!             .unwrap().int().unwrap());
18//!     }
19//! ```
20//!
21//! Encoding bencoded data:
22//!
23//! ```rust
24//!     #[macro_use]
25//!     extern crate bencode;
26//!
27//!     fn main() {
28//!         let message = (ben_map!{
29//!             "lucky_number" => ben_int!(7),
30//!             "lucky_string" => ben_bytes!("7")
31//!         }).encode();
32//!
33//!         let data = b"d12:lucky_numberi7e12:lucky_string1:7e"; // cspell:disable-line
34//!         assert_eq!(&data[..], &message[..]);
35//!     }
36//! ```
37
38mod access;
39mod cow;
40mod error;
41mod mutable;
42mod reference;
43
44/// Traits for implementation functionality.
45pub mod inner {
46    pub use crate::cow::BCowConvert;
47}
48
49/// Traits for extended functionality.
50pub mod ext {
51    #[allow(clippy::module_name_repetitions)]
52    pub use crate::access::bencode::BRefAccessExt;
53    #[allow(clippy::module_name_repetitions)]
54    pub use crate::access::convert::BConvertExt;
55}
56
57#[deprecated(since = "1.0.0", note = "use `MutKind` instead.")]
58pub use crate::access::bencode::MutKind as BencodeMutKind;
59#[deprecated(since = "1.0.0", note = "use `RefKind` instead.")]
60pub use crate::access::bencode::RefKind as BencodeRefKind;
61pub use crate::access::bencode::{BMutAccess, BRefAccess, MutKind, RefKind};
62pub use crate::access::convert::BConvert;
63pub use crate::access::dict::BDictAccess;
64pub use crate::access::list::BListAccess;
65pub use crate::error::{BencodeConvertError, BencodeConvertResult, BencodeParseError, BencodeParseResult};
66pub use crate::mutable::bencode_mut::BencodeMut;
67pub use crate::reference::bencode_ref::BencodeRef;
68pub use crate::reference::decode_opt::BDecodeOpt;
69
70const BEN_END: u8 = b'e';
71const DICT_START: u8 = b'd';
72const LIST_START: u8 = b'l';
73const INT_START: u8 = b'i';
74
75const BYTE_LEN_LOW: u8 = b'0';
76const BYTE_LEN_HIGH: u8 = b'9';
77const BYTE_LEN_END: u8 = b':';
78
79/// Construct a `BencodeMut` map by supplying string references as keys and `BencodeMut` as values.
80#[macro_export]
81macro_rules! ben_map {
82( $($key:expr => $val:expr),* ) => {
83        {
84            use $crate::{BMutAccess, BencodeMut};
85            use $crate::inner::BCowConvert;
86
87            let mut bencode_map = BencodeMut::new_dict();
88            {
89                let map = bencode_map.dict_mut().unwrap();
90                $(
91                    map.insert(BCowConvert::convert($key), $val);
92                )*
93            }
94
95            bencode_map
96        }
97    }
98}
99
100/// Construct a `BencodeMut` list by supplying a list of `BencodeMut` values.
101#[macro_export]
102macro_rules! ben_list {
103    ( $($ben:expr),* ) => {
104        {
105            use $crate::{BencodeMut, BMutAccess};
106
107            let mut bencode_list = BencodeMut::new_list();
108            {
109                let list = bencode_list.list_mut().unwrap();
110                $(
111                    list.push($ben);
112                )*
113            }
114
115            bencode_list
116        }
117    }
118}
119
120/// Construct `BencodeMut` bytes by supplying a type convertible to `Vec<u8>`.
121#[macro_export]
122macro_rules! ben_bytes {
123    ( $ben:expr ) => {{
124        use $crate::inner::BCowConvert;
125        use $crate::BencodeMut;
126
127        BencodeMut::new_bytes(BCowConvert::convert($ben))
128    }};
129}
130
131/// Construct a `BencodeMut` integer by supplying an `i64`.
132#[macro_export]
133macro_rules! ben_int {
134    ( $ben:expr ) => {{
135        use $crate::BencodeMut;
136
137        BencodeMut::new_int($ben)
138    }};
139}