1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
use crate::Result;

pub trait Read {
    fn read(&self, buffer: &mut [u8]) -> Result<usize>;
}

pub trait ReadAt {
    fn read_at(&self, offset: u64, buffer: &mut [u8]) -> Result<usize>;
}

pub trait Flush {
    fn flush(&self) -> Result<()>;
}

pub trait Size {
    fn size(&self) -> Result<u64>;
}

pub trait Write: Flush {
    fn write(&self, data: &[u8]) -> Result<usize>;
}

pub trait WriteAt: Flush {
    fn write_at(&self, offset: u64, data: &[u8]) -> Result<usize>;
}

pub enum SeekFrom {
    Start(u64),
    End(i64),
    Current(i64),
}

impl From<u64> for SeekFrom {
    fn from(value: u64) -> Self {
        SeekFrom::Start(value)
    }
}

pub trait Seek {
    fn seek(&self, to: SeekFrom) -> Result<u64>;
    fn stream_position(&self) -> Result<u64>;
    fn stream_len(&self) -> Result<u64>;
}