minxp 0.1.7

Partial reimplementation of std for no-std on unsupported Windows targets.
Documentation
use alloc::vec::Vec;
use core::fmt::Arguments;
use super::{Error, Result};

pub trait Write {
    fn write(&mut self, buf: &[u8]) -> Result<usize>;
    fn flush(&mut self) -> Result<()>;

    fn write_all(&mut self, buf: &[u8]) -> Result<()> {
        let mut b = buf;
        while !b.is_empty() {
            let bytes_written = self.write(b)?;
            b = &b[bytes_written..];
        }
        Ok(())
    }

    fn write_fmt(&mut self, fmt: Arguments<'_>) -> Result<()> {
        struct FmtWriter<'a, W: Write + ?Sized> {
            something: &'a mut W
        }

        impl<'a, W: Write + ?Sized> core::fmt::Write for FmtWriter<'a, W> {
            fn write_str(&mut self, s: &str) -> core::fmt::Result {
                // write_fmt internally uses write_all
                let _ = self.something.write_all(s.as_bytes());
                Ok(())
            }
        }

        core::fmt::write(&mut FmtWriter { something: self }, fmt)
            .map_err(|e| Error { reason: alloc::format!("write_fmt error: {e}") })
    }
}

pub trait Read {
    // TODO: Implement EOF handling
    fn read(&mut self, buf: &mut [u8]) -> Result<usize>;

    // TODO: Implement EOF handling
    fn read_to_end(&mut self, into: &mut Vec<u8>) -> Result<()>;

    // TODO: Implement EOF handling
    fn read_exact(&mut self, buf: &mut [u8]) -> Result<()>;
}

#[derive(Copy, Clone, PartialEq)]
pub enum SeekFrom {
    Start(u64),
    End(i64),
    Current(i64)
}

pub trait Seek {
    fn seek(&mut self, pos: SeekFrom) -> Result<u64>;
    fn seek_position(&mut self) -> Result<u64> {
        self.seek(SeekFrom::Current(0))
    }
    fn seek_relative(&mut self, offset: i64) -> Result<u64> {
        self.seek(SeekFrom::Current(offset))
    }
}