cyfs_base/codec/raw/
raw_util.rs

1use 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                // let mut buf = Vec::<u8>::new();
68                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        // println!("buffer_len:{}", buf.len());
113        // assert_eq!(_buf.len(),0);
114        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}