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}