cyfs_base/codec/raw/
raw_util.rs1use crate::*;
2
3use std::io::Read;
4use std::path::Path;
5
6pub trait FileEncoder<D> {
7 fn suggest_buffer_size(&self) -> BuckyResult<usize>;
8 fn encode<'a>(&self, buf: &'a mut [u8], is_compress: bool) -> BuckyResult<&'a mut [u8]>;
9
10 fn encode_to_writer(
11 &self,
12 mut writer: impl std::io::Write,
13 is_compress: bool,
14 ) -> BuckyResult<usize> {
15 let len = self.suggest_buffer_size()?;
16 let mut buf = Vec::with_capacity(len);
17 buf.resize(len, 0);
18
19 let rest = self.encode(buf.as_mut_slice(), is_compress)?;
20
21 let encode_len = len - rest.len();
22 match writer.write(&buf[..encode_len]) {
23 Ok(_n) => Ok(encode_len),
24 Err(e) => Err(BuckyError::from(e)),
25 }
26 }
27
28 fn encode_to_file(&self, file: &Path, is_compress: bool) -> BuckyResult<usize> {
29 match std::fs::File::create(file) {
30 Ok(file) => self.encode_to_writer(file, is_compress),
31 Err(e) => Err(BuckyError::from(e)),
32 }
33 }
34
35 fn encode_to_vec(&self, is_compress: bool) -> BuckyResult<Vec<u8>> {
36 let len = self.suggest_buffer_size()?;
37 let mut buf = Vec::with_capacity(len);
38 buf.resize(len, 0);
39 self.encode(buf.as_mut_slice(), is_compress)?;
40 Ok(buf)
41 }
42}
43
44impl<D> FileEncoder<D> for D
45where
46 D: RawEncode,
47{
48 fn suggest_buffer_size(&self) -> BuckyResult<usize> {
49 self.raw_measure(&None)
50 }
51 fn encode<'a>(&self, buf: &'a mut [u8], _is_compress: bool) -> BuckyResult<&'a mut [u8]> {
52 self.raw_encode(buf, &None)
53 }
54}
55
56pub trait FileDecoder<'de>: Sized {
57 fn decode_from_file(file: &Path, buf: &'de mut Vec<u8>) -> BuckyResult<(Self, usize)>;
58}
59
60impl<'de, D> FileDecoder<'de> for D
61where
62 D: RawDecode<'de>,
63{
64 fn decode_from_file(file: &Path, buf: &'de mut Vec<u8>) -> BuckyResult<(Self, usize)> {
65 match std::fs::File::open(file) {
66 Ok(mut file) => {
67 if let Err(e) = file.read_to_end(buf) {
69 return Err(BuckyError::from(e));
70 }
71 let len = buf.len();
72 let (obj, buf) = D::raw_decode(buf.as_slice())?;
73 let size = len - buf.len();
74 Ok((obj, size))
75 }
76 Err(e) => Err(BuckyError::from(e)),
77 }
78 }
79}
80
81pub trait RawConvertTo<O> {
82 fn to_vec(&self) -> BuckyResult<Vec<u8>>;
83 fn to_hex(&self) -> BuckyResult<String>;
84}
85
86pub trait RawFrom<'de, O> {
87 fn clone_from_slice(buf: &'de [u8]) -> BuckyResult<O>;
88 fn clone_from_hex(hex_str: &str, buf: &'de mut Vec<u8>) -> BuckyResult<O>;
89}
90
91impl<T> RawConvertTo<T> for T
92where
93 T: RawEncode,
94{
95 fn to_vec(&self) -> BuckyResult<Vec<u8>> {
96 self.raw_encode_to_buffer()
97 }
98
99 fn to_hex(&self) -> BuckyResult<String> {
100 let buf = self.to_vec()?;
101 Ok(hex::encode(buf))
102 }
103}
104
105impl<'de, O> RawFrom<'de, O> for O
106where
107 O: RawDecode<'de>,
108{
109 fn clone_from_slice(buf: &'de [u8]) -> BuckyResult<O> {
110 let (t, _buf) = O::raw_decode(buf)?;
111
112 Ok(t)
115 }
116
117 fn clone_from_hex(hex_str: &str, buf: &'de mut Vec<u8>) -> BuckyResult<O> {
118 let buf_size = hex_str.len() / 2;
119 buf.resize(buf_size, 0);
120 hex::decode_to_slice(hex_str, buf)?;
121
122 let (t, _buf) = O::raw_decode(buf)?;
123
124 Ok(t)
125 }
126}