tmpl_resolver/resolver/
bin_code.rs

1use std::{
2  fs::File,
3  io::{BufReader, BufWriter},
4  path::Path,
5};
6
7use bincode::serde::{decode_from_std_read, encode_into_std_write};
8use tap::Pipe;
9
10use crate::{
11  TemplateResolver, error::ResolverResult, resolver::bin_code_nostd::bincode_std_cfg,
12};
13
14impl TemplateResolver {
15  /// Serializes the resolver to bincode format and writes to a file
16  ///
17  /// ## Design Notes
18  ///
19  /// - Uses buffered writer for optimal large-file performance
20  /// - Leverages bincode's compact binary representation
21  /// - Preserves structure ordering through deterministic serialization
22  ///
23  /// ## Example
24  ///
25  /// ```no_run
26  /// use tmpl_resolver::TemplateResolver;
27  ///
28  /// let resolver: TemplateResolver = [
29  ///     ("h", "Hello"),
30  ///     ("greeting", "{h} { $name }!")
31  ///   ]
32  ///   .try_into()
33  ///   .expect("Invalid slice");
34  ///
35  /// let file = "tmp.bincode";
36  ///
37  /// resolver.encode_bin(file).expect("Failed to encode TemplateResolver to bincode file");
38  /// ```
39  pub fn encode_bin<P: AsRef<Path>>(&self, dst_file: P) -> ResolverResult<usize> {
40    let encode = |dst| encode_into_std_write(self, dst, bincode_std_cfg());
41
42    dst_file
43      .pipe(File::create)?
44      .pipe(BufWriter::new) // Buffer writes for efficiency
45      .pipe_ref_mut(encode)? // Stream encoding
46      .pipe(Ok)
47  }
48
49  /// Deserializes a resolver from bincode-formatted file
50  ///
51  /// It Uses buffered reading for I/O efficiency.
52  ///
53  /// ## Example
54  ///
55  /// ```no_run
56  /// use tmpl_resolver::TemplateResolver;
57  ///
58  /// let file = "tmp.bincode";
59  ///
60  /// TemplateResolver::decode_bin(file).expect("Failed to decode bincode file to TemplateResolver");
61  /// ```
62  pub fn decode_bin<P: AsRef<Path>>(src_file: P) -> ResolverResult<Self> {
63    let decode = |src| decode_from_std_read::<Self, _, _>(src, bincode_std_cfg());
64
65    src_file
66      .pipe(File::open)? // Open with read-only access
67      .pipe(BufReader::new) // Buffer reads for performance
68      .pipe_ref_mut(decode)? // Stream decoding
69      .pipe(Ok)
70  }
71}