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}