glossa_dsl/resolver/bin_code_nostd.rs
1pub(crate) use bincode::config::standard as bincode_std_cfg;
2use tap::Pipe;
3
4use crate::{Resolver, error::ResolverResult};
5
6impl Resolver {
7 /// Decodes binary data into Resolver using bincode's optimized
8 /// deserialization.
9 ///
10 /// ## Input
11 ///
12 /// - `slice` - Binary input slice containing serialized Resolver data
13 ///
14 /// ## Output
15 ///
16 /// - A tuple of (deserialized Resolver, amount of bytes read) on success
17 /// - Error details if deserialization fails
18 ///
19 /// See also: [bincode::serde::decode_from_slice]
20 pub fn decode_bin_from_slice(slice: &[u8]) -> ResolverResult<(Self, usize)> {
21 bincode::serde::decode_from_slice(slice, bincode_std_cfg())?.pipe(Ok)
22 }
23
24 /// Encodes the Self(Resolver) into a binary format stored in a
25 /// [`Vec<u8>`].
26 ///
27 /// ## Example
28 ///
29 /// ```
30 /// use glossa_dsl::Resolver;
31 ///
32 /// let res: Resolver =
33 /// [("🐱", "喵 ฅ(°ω°ฅ)"), ("hello", "{🐱}")].try_into()?;
34 ///
35 /// let _data = res.encode_bin_to_vec()?;
36 ///
37 /// # Ok::<(), glossa_dsl::error::ResolverError>(())
38 /// ```
39 ///
40 /// See also: [bincode::serde::encode_to_vec]
41 pub fn encode_bin_to_vec(&self) -> ResolverResult<alloc::vec::Vec<u8>> {
42 bincode::serde::encode_to_vec(self, bincode_std_cfg())?.pipe(Ok)
43 }
44}
45
46#[cfg(test)]
47mod tests {
48 use super::*;
49
50 /// - release: 1.542µs
51 /// - debug: 7.375µs
52 #[test]
53 #[ignore]
54 #[cfg(feature = "std")]
55 fn bench_encode_bin() -> ResolverResult<()> {
56 use testutils::simple_benchmark;
57
58 // use glossa_dsl::Resolver;
59 use crate::Resolver;
60 let res: Resolver = [("🐱", "喵 ฅ(°ω°ฅ)"), ("hello", "{🐱}")].try_into()?;
61
62 simple_benchmark(|| res.encode_bin_to_vec());
63
64 let _data = res.encode_bin_to_vec()?;
65
66 // println!("{}", data.capacity());
67 // dbg!(data);
68
69 Ok(())
70 }
71}