objstr/file/
file_obj_str.rs1use 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}