pub mod file;
use crate::{
core::{optional::NSTDOptional, result::NSTDResult, slice::NSTDSlice, str::NSTDStr},
io::{NSTDIOBufferResult, NSTDIOError, NSTDIOStringResult},
string::NSTDString,
time::{NSTDOptionalTime, NSTDTime},
vec::NSTDVec,
NSTDUInt64, NSTDUInt8,
};
use nstdapi::nstdapi;
use std::fs::File;
pub const NSTD_FILE_PERMISSION_READ: NSTDUInt8 = 1;
#[nstdapi]
#[derive(Clone, Copy, PartialEq, Eq)]
#[allow(non_camel_case_types)]
pub enum NSTDFileType {
NSTD_FILE_TYPE_UNKNOWN,
NSTD_FILE_TYPE_REGULAR,
NSTD_FILE_TYPE_DIRECTORY,
NSTD_FILE_TYPE_SYMLINK,
}
#[nstdapi]
#[derive(Clone, Copy)]
pub struct NSTDFileMetadata {
pub size: NSTDUInt64,
pub created: NSTDOptionalTime,
pub accessed: NSTDOptionalTime,
pub modified: NSTDOptionalTime,
pub file_type: NSTDFileType,
pub permissions: NSTDUInt8,
}
pub type NSTDFileMetadataResult = NSTDResult<NSTDFileMetadata, NSTDIOError>;
#[inline]
#[nstdapi]
pub unsafe fn nstd_fs_create_file(name: &NSTDStr) -> NSTDIOError {
if let Err(err) = File::create(name.as_str()) {
return NSTDIOError::from_err(err.kind());
}
NSTDIOError::NSTD_IO_ERROR_NONE
}
#[inline]
#[nstdapi]
pub unsafe fn nstd_fs_create_dir(name: &NSTDStr) -> NSTDIOError {
if let Err(err) = std::fs::create_dir(name.as_str()) {
return NSTDIOError::from_err(err.kind());
}
NSTDIOError::NSTD_IO_ERROR_NONE
}
#[inline]
#[nstdapi]
pub unsafe fn nstd_fs_create_dirs(name: &NSTDStr) -> NSTDIOError {
if let Err(err) = std::fs::create_dir_all(name.as_str()) {
return NSTDIOError::from_err(err.kind());
}
NSTDIOError::NSTD_IO_ERROR_NONE
}
#[inline]
#[nstdapi]
pub unsafe fn nstd_fs_remove_file(name: &NSTDStr) -> NSTDIOError {
if let Err(err) = std::fs::remove_file(name.as_str()) {
return NSTDIOError::from_err(err.kind());
}
NSTDIOError::NSTD_IO_ERROR_NONE
}
#[inline]
#[nstdapi]
pub unsafe fn nstd_fs_remove_dir(name: &NSTDStr) -> NSTDIOError {
if let Err(err) = std::fs::remove_dir(name.as_str()) {
return NSTDIOError::from_err(err.kind());
}
NSTDIOError::NSTD_IO_ERROR_NONE
}
#[inline]
#[nstdapi]
pub unsafe fn nstd_fs_remove_dirs(name: &NSTDStr) -> NSTDIOError {
if let Err(err) = std::fs::remove_dir_all(name.as_str()) {
return NSTDIOError::from_err(err.kind());
}
NSTDIOError::NSTD_IO_ERROR_NONE
}
#[nstdapi]
pub unsafe fn nstd_fs_read(path: &NSTDStr) -> NSTDIOBufferResult<'_> {
match std::fs::read(path.as_str()) {
Ok(contents) => NSTDResult::Ok(NSTDVec::from_vec(contents)),
Err(err) => NSTDResult::Err(NSTDIOError::from_err(err.kind())),
}
}
#[nstdapi]
pub unsafe fn nstd_fs_read_to_string(path: &NSTDStr) -> NSTDIOStringResult<'_> {
match std::fs::read_to_string(path.as_str()) {
Ok(contents) => NSTDResult::Ok(NSTDString::from_string(contents)),
Err(err) => NSTDResult::Err(NSTDIOError::from_err(err.kind())),
}
}
#[nstdapi]
pub unsafe fn nstd_fs_write(path: &NSTDStr, content: &NSTDSlice) -> NSTDIOError {
content.as_slice().map_or(
NSTDIOError::NSTD_IO_ERROR_INVALID_INPUT,
|bytes| match std::fs::write(path.as_str(), bytes) {
Ok(()) => NSTDIOError::NSTD_IO_ERROR_NONE,
Err(err) => NSTDIOError::from_err(err.kind()),
},
)
}
#[inline]
#[nstdapi]
pub unsafe fn nstd_fs_rename(from: &NSTDStr, to: &NSTDStr) -> NSTDIOError {
if let Err(err) = std::fs::rename(from.as_str(), to.as_str()) {
return NSTDIOError::from_err(err.kind());
}
NSTDIOError::NSTD_IO_ERROR_NONE
}
#[inline]
#[nstdapi]
pub unsafe fn nstd_fs_copy(from: &NSTDStr, to: &NSTDStr) -> NSTDIOError {
if let Err(err) = std::fs::copy(from.as_str(), to.as_str()) {
return NSTDIOError::from_err(err.kind());
}
NSTDIOError::NSTD_IO_ERROR_NONE
}
#[nstdapi]
pub unsafe fn nstd_fs_absolute(path: &NSTDStr) -> NSTDIOStringResult<'_> {
match std::fs::canonicalize(path.as_str()) {
Ok(path) => path.into_os_string().into_string().map_or(
NSTDResult::Err(NSTDIOError::NSTD_IO_ERROR_INVALID_DATA),
|path| NSTDResult::Ok(NSTDString::from_string(path)),
),
Err(err) => NSTDResult::Err(NSTDIOError::from_err(err.kind())),
}
}
#[nstdapi]
pub unsafe fn nstd_fs_metadata(path: &NSTDStr) -> NSTDFileMetadataResult {
match std::fs::metadata(path.as_str()) {
Ok(metadata) => NSTDResult::Ok(NSTDFileMetadata {
size: metadata.len(),
created: metadata.created().map_or(NSTDOptional::None, |t| {
NSTDOptional::Some(NSTDTime::from(t))
}),
accessed: metadata.accessed().map_or(NSTDOptional::None, |t| {
NSTDOptional::Some(NSTDTime::from(t))
}),
modified: metadata.modified().map_or(NSTDOptional::None, |t| {
NSTDOptional::Some(NSTDTime::from(t))
}),
file_type: {
if metadata.is_file() {
NSTDFileType::NSTD_FILE_TYPE_REGULAR
} else if metadata.is_dir() {
NSTDFileType::NSTD_FILE_TYPE_DIRECTORY
} else if metadata.is_symlink() {
NSTDFileType::NSTD_FILE_TYPE_SYMLINK
} else {
NSTDFileType::NSTD_FILE_TYPE_UNKNOWN
}
},
permissions: metadata.permissions().readonly().into(),
}),
Err(err) => NSTDResult::Err(NSTDIOError::from_err(err.kind())),
}
}