browser-fs 0.1.0

A browser-based filesystem implementation for WebAssembly applications
Documentation
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))
    }
}