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}