#[cfg(unix)]
use std::os::unix::io::{AsRawFd, FromRawFd, IntoRawFd, RawFd};
#[cfg(windows)]
use std::os::windows::io::{AsRawHandle, FromRawHandle, IntoRawHandle, RawHandle};
use std::{fs, io, process};
pub struct File {
std: fs::File,
}
impl File {
#[inline]
pub fn from_std(std: fs::File) -> Self {
Self { std }
}
#[inline]
pub fn sync_all(&self) -> io::Result<()> {
self.std.sync_all()
}
#[inline]
pub fn sync_data(&self) -> io::Result<()> {
self.std.sync_data()
}
#[inline]
pub fn set_len(&self, size: u64) -> io::Result<()> {
self.std.set_len(size)
}
#[inline]
pub fn metadata(&self) -> io::Result<fs::Metadata> {
self.std.metadata()
}
#[inline]
pub fn try_clone(&self) -> io::Result<Self> {
Ok(Self::from_std(self.std.try_clone()?))
}
}
#[cfg(unix)]
impl FromRawFd for File {
#[inline]
unsafe fn from_raw_fd(fd: RawFd) -> Self {
Self::from_std(fs::File::from_raw_fd(fd))
}
}
#[cfg(windows)]
impl FromRawHandle for File {
#[inline]
unsafe fn from_raw_handle(handle: RawHandle) -> Self {
Self::from_std(fs::File::from_raw_handle(handle))
}
}
#[cfg(unix)]
impl AsRawFd for File {
#[inline]
fn as_raw_fd(&self) -> RawFd {
self.std.as_raw_fd()
}
}
#[cfg(windows)]
impl AsRawHandle for File {
#[inline]
fn as_raw_handle(&self) -> RawHandle {
self.std.as_raw_handle()
}
}
#[cfg(unix)]
impl IntoRawFd for File {
#[inline]
fn into_raw_fd(self) -> RawFd {
self.std.into_raw_fd()
}
}
#[cfg(windows)]
impl IntoRawHandle for File {
#[inline]
fn into_raw_handle(self) -> RawHandle {
self.std.into_raw_handle()
}
}
impl io::Read for File {
#[inline]
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
self.std.read(buf)
}
#[inline]
fn read_vectored(&mut self, bufs: &mut [io::IoSliceMut]) -> io::Result<usize> {
self.std.read_vectored(bufs)
}
#[inline]
fn read_exact(&mut self, buf: &mut [u8]) -> io::Result<()> {
self.std.read_exact(buf)
}
#[inline]
fn read_to_end(&mut self, buf: &mut Vec<u8>) -> io::Result<usize> {
self.std.read_to_end(buf)
}
#[inline]
fn read_to_string(&mut self, buf: &mut String) -> io::Result<usize> {
self.std.read_to_string(buf)
}
}
impl io::Write for File {
#[inline]
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
self.std.write(buf)
}
#[inline]
fn flush(&mut self) -> io::Result<()> {
self.std.flush()
}
#[inline]
fn write_vectored(&mut self, bufs: &[io::IoSlice]) -> io::Result<usize> {
self.std.write_vectored(bufs)
}
#[inline]
fn write_all(&mut self, buf: &[u8]) -> io::Result<()> {
self.std.write_all(buf)
}
}
impl io::Seek for File {
#[inline]
fn seek(&mut self, pos: io::SeekFrom) -> io::Result<u64> {
self.std.seek(pos)
}
}
impl From<File> for process::Stdio {
#[inline]
fn from(file: File) -> Self {
From::<fs::File>::from(file.std)
}
}
#[cfg(unix)]
impl std::os::unix::fs::FileExt for File {
#[inline]
fn read_at(&self, buf: &mut [u8], offset: u64) -> io::Result<usize> {
self.std.read_at(buf, offset)
}
#[inline]
fn write_at(&self, buf: &[u8], offset: u64) -> io::Result<usize> {
self.std.write_at(buf, offset)
}
#[inline]
fn read_exact_at(&self, buf: &mut [u8], offset: u64) -> io::Result<()> {
self.std.read_exact_at(buf, offset)
}
#[inline]
fn write_all_at(&self, buf: &[u8], offset: u64) -> io::Result<()> {
self.std.write_all_at(buf, offset)
}
}
#[cfg(windows)]
impl std::os::windows::fs::FileExt for File {
#[inline]
fn seek_read(&self, buf: &mut [u8], offset: u64) -> io::Result<usize> {
self.std.seek_read(buf, offset)
}
#[inline]
fn seek_write(&self, buf: &[u8], offset: u64) -> io::Result<usize> {
self.std.seek_write(buf, offset)
}
}