browser_fs/
seek.rs

1use std::io::{Error, ErrorKind, Result, SeekFrom};
2use std::pin::Pin;
3use std::task::{Context, Poll};
4
5use futures_lite::AsyncSeek;
6
7impl AsyncSeek for crate::File {
8    fn poll_seek(
9        mut self: Pin<&mut Self>,
10        _cx: &mut Context<'_>,
11        pos: std::io::SeekFrom,
12    ) -> Poll<Result<u64>> {
13        match pos {
14            SeekFrom::Start(value) => {
15                self.offset = value as u32;
16            }
17            SeekFrom::End(value) => {
18                let size = match self.access.get_size() {
19                    Ok(inner) => inner as i64,
20                    Err(err) => return Poll::Ready(Err(crate::from_js_error(err))),
21                };
22                let new_offset = size + value;
23                if new_offset < 0 {
24                    return Poll::Ready(Err(Error::new(
25                        ErrorKind::InvalidInput,
26                        "unable to address negative offset",
27                    )));
28                }
29                match u32::try_from(new_offset) {
30                    Ok(value) => {
31                        self.offset = value;
32                    }
33                    Err(_) => {
34                        return Poll::Ready(Err(Error::new(
35                            ErrorKind::InvalidInput,
36                            "unable to address expected offset",
37                        )))
38                    }
39                }
40                self.offset = (size + value) as u32;
41            }
42            SeekFrom::Current(delta) => {
43                self.offset = ((self.offset as i64) + delta) as u32;
44            }
45        }
46        Poll::Ready(Ok(self.offset as u64))
47    }
48}