use std::io::{Error, ErrorKind, Result, SeekFrom};
use std::pin::Pin;
use std::task::{Context, Poll};
use futures_lite::AsyncSeek;
impl AsyncSeek for crate::File {
fn poll_seek(
mut self: Pin<&mut Self>,
_cx: &mut Context<'_>,
pos: std::io::SeekFrom,
) -> Poll<Result<u64>> {
match pos {
SeekFrom::Start(value) => {
self.offset = value as u32;
}
SeekFrom::End(value) => {
let size = match self.access.get_size() {
Ok(inner) => inner as i64,
Err(err) => return Poll::Ready(Err(crate::from_js_error(err))),
};
let new_offset = size + value;
if new_offset < 0 {
return Poll::Ready(Err(Error::new(
ErrorKind::InvalidInput,
"unable to address negative offset",
)));
}
match u32::try_from(new_offset) {
Ok(value) => {
self.offset = value;
}
Err(_) => {
return Poll::Ready(Err(Error::new(
ErrorKind::InvalidInput,
"unable to address expected offset",
)))
}
}
self.offset = (size + value) as u32;
}
SeekFrom::Current(delta) => {
self.offset = ((self.offset as i64) + delta) as u32;
}
}
Poll::Ready(Ok(self.offset as u64))
}
}