objstr/file/
file_obj_str.rs

1use std::{fs::{File, OpenOptions}, io::{Error, ErrorKind, SeekFrom}, path::Path};
2
3use crate::api::ObjStr;
4
5use super::helpers::{cut, inner_len, jump_stream_end, jump_stream_start, len_calc, read, seek_backward_n, seek_forward, seek_forward_n, truncate, write, write_empty_byte};
6
7pub struct FileObjStr {
8    file: File
9}
10
11impl FileObjStr {
12    pub fn new(path: &Path) -> Result<FileObjStr, Error> {
13        let mut file: File;
14
15        if path.exists() {
16            file = OpenOptions::new()
17                .read(true)
18                .write(true)
19                .open(path)?;
20        } else {
21            file = OpenOptions::new()
22                .read(true)
23                .write(true)
24                .create(true)
25                .open(path)?;
26            truncate(&mut file);
27        }     
28
29        Ok(
30            FileObjStr {
31                file
32            }
33        )
34    }
35}
36
37impl ObjStr for FileObjStr {
38
39    fn seek(&mut self, pos: SeekFrom) -> Result<(), Error> {
40        
41        match pos {
42            SeekFrom::Start(pos) => {
43                jump_stream_start(&mut self.file);
44                seek_forward_n(&mut self.file, pos)?;
45            },
46            SeekFrom::End(pos) => {
47                jump_stream_end(&mut self.file);
48                seek_backward_n(&mut self.file, pos.abs() as u64)?;
49            },
50            SeekFrom::Current(pos) => {
51                let pos_abs = pos.abs() as u64;
52                if pos < 0 {
53                    seek_backward_n(&mut self.file, pos_abs)?;
54                } else if pos > 0 {
55                    seek_forward_n(&mut self.file, pos_abs)?;
56                }
57            }
58        }
59
60        Ok(())
61
62    }
63
64    fn read(&mut self) -> Result<Vec<u8>, Error> {
65        Ok(read(&mut self.file)?)
66    }
67
68    fn len(&mut self, contents: u8, objs: u8) -> Result<u64, Error> {
69
70        let mut inner_lens = Vec::new();
71
72        for _ in 0..objs {
73            inner_lens.push(
74                inner_len(&mut self.file)?
75            );
76            seek_forward(&mut self.file)?;
77        }
78
79        seek_backward_n(&mut self.file, objs as u64)?;
80
81        let len = len_calc(inner_lens, contents);
82
83        if len < 0 {
84            return Err(Error::new(ErrorKind::Other, "To small to fit that many objects"));
85        }
86        
87        Ok(len.abs() as u64)
88    }
89
90    fn overwrite(&mut self, data: Vec<Vec<u8>>, objs: u8) -> Result<(), Error> {
91        if data.len() > u8::MAX as usize {
92            return Err(Error::new(ErrorKind::Other, "To many objects"));
93        }
94
95        let inner_len = self.len(data.len() as u8, objs)?;
96        let actual_len = data.iter().fold(0, |acc, x| acc + x.len()) as u64;
97
98        if inner_len != actual_len {
99            return Err(Error::new(ErrorKind::Other, "Wrong length"));
100        }
101
102        for d in data {
103            write(&mut self.file, d)?;
104        }
105
106        Ok(())
107    }
108
109    fn append(&mut self, data: Vec<u8>) -> Result<(), Error> {
110        jump_stream_end(&mut self.file);
111        write(&mut self.file, data)?;
112        write_empty_byte(&mut self.file);
113        Ok(())
114    }
115
116    fn cut(&mut self) -> Result<(), Error> {
117        cut(&mut self.file);
118        Ok(())
119    }
120}