use crate::{
alloc::CBox,
core::{
result::NSTDResult,
slice::{NSTDSlice, NSTDSliceMut},
str::NSTDStr,
},
io::{NSTDIOError, NSTDIOResult},
string::NSTDString,
vec::NSTDVec,
NSTDUInt8,
};
use nstdapi::nstdapi;
use std::fs::File;
#[cfg(unix)]
use std::os::unix::io::AsRawFd;
pub const NSTD_FILE_CREATE: NSTDUInt8 = 1;
pub const NSTD_FILE_READ: NSTDUInt8 = 1 << 1;
pub const NSTD_FILE_WRITE: NSTDUInt8 = 1 << 2;
pub const NSTD_FILE_APPEND: NSTDUInt8 = 1 << 3;
pub const NSTD_FILE_TRUNC: NSTDUInt8 = 1 << 4;
#[nstdapi]
pub struct NSTDFile {
f: CBox<File>,
}
pub type NSTDFileResult = NSTDResult<NSTDFile, NSTDIOError>;
#[nstdapi]
pub unsafe fn nstd_fs_file_open(name: &NSTDStr, mask: NSTDUInt8) -> NSTDFileResult {
match File::options()
.create((mask & NSTD_FILE_CREATE) != 0)
.read((mask & NSTD_FILE_READ) != 0)
.write((mask & NSTD_FILE_WRITE) != 0)
.append((mask & NSTD_FILE_APPEND) != 0)
.truncate((mask & NSTD_FILE_TRUNC) != 0)
.open(name.as_str())
{
Ok(f) => CBox::new(f).map_or(
NSTDResult::Err(NSTDIOError::NSTD_IO_ERROR_OUT_OF_MEMORY),
|f| NSTDResult::Ok(NSTDFile { f }),
),
Err(err) => NSTDResult::Err(NSTDIOError::from_err(err.kind())),
}
}
#[inline]
#[nstdapi]
pub unsafe fn nstd_fs_file_write(file: &mut NSTDFile, bytes: &NSTDSlice) -> NSTDIOResult {
#[cfg(not(unix))]
return crate::io::stdio::write(&mut *file.f, bytes);
#[cfg(unix)]
return crate::os::unix::io::stdio::write(file.f.as_raw_fd(), bytes).into();
}
#[inline]
#[nstdapi]
pub unsafe fn nstd_fs_file_write_all(file: &mut NSTDFile, bytes: &NSTDSlice) -> NSTDIOError {
#[cfg(not(unix))]
return crate::io::stdio::write_all(&mut *file.f, bytes);
#[cfg(unix)]
return crate::os::unix::io::stdio::write_all(file.f.as_raw_fd(), bytes).into();
}
#[inline]
#[nstdapi]
pub fn nstd_fs_file_flush(file: &mut NSTDFile) -> NSTDIOError {
crate::io::stdio::flush(&mut *file.f)
}
#[inline]
#[nstdapi]
pub unsafe fn nstd_fs_file_read(file: &mut NSTDFile, buffer: &mut NSTDSliceMut) -> NSTDIOResult {
#[cfg(not(unix))]
return crate::io::stdio::read(&mut *file.f, buffer);
#[cfg(unix)]
return crate::os::unix::io::stdio::read(file.f.as_raw_fd(), buffer).into();
}
#[inline]
#[nstdapi]
pub fn nstd_fs_file_read_all(file: &mut NSTDFile, buffer: &mut NSTDVec<'_>) -> NSTDIOResult {
#[cfg(not(unix))]
return crate::io::stdio::read_all(&mut *file.f, buffer);
#[cfg(unix)]
return unsafe { crate::os::unix::io::stdio::read_all(file.f.as_raw_fd(), buffer).into() };
}
#[inline]
#[nstdapi]
pub fn nstd_fs_file_read_to_string(
file: &mut NSTDFile,
buffer: &mut NSTDString<'_>,
) -> NSTDIOResult {
#[cfg(not(unix))]
return crate::io::stdio::read_to_string(&mut *file.f, buffer);
#[cfg(unix)]
return unsafe {
crate::os::unix::io::stdio::read_to_string(file.f.as_raw_fd(), buffer).into()
};
}
#[inline]
#[nstdapi]
pub unsafe fn nstd_fs_file_read_exact(
file: &mut NSTDFile,
buffer: &mut NSTDSliceMut,
) -> NSTDIOError {
#[cfg(not(unix))]
return crate::io::stdio::read_exact(&mut *file.f, buffer);
#[cfg(unix)]
return crate::os::unix::io::stdio::read_exact(file.f.as_raw_fd(), buffer).into();
}
#[inline]
#[nstdapi]
#[allow(
unused_variables,
clippy::missing_const_for_fn,
clippy::needless_pass_by_value
)]
pub fn nstd_fs_file_close(file: NSTDFile) {}