use crate::{
alloc::NSTD_ALLOCATOR,
core::{
alloc::NSTDAllocError::NSTD_ALLOC_ERROR_NONE, optional::NSTDOptional, result::NSTDResult,
str::NSTDStr,
},
io::{NSTDIOError, NSTDIOStringResult},
string::{NSTDOptionalString, NSTDString},
vec::{nstd_vec_new, nstd_vec_push, NSTDVec},
};
use core::ptr::addr_of;
use nstdapi::nstdapi;
use std::env::VarError;
#[nstdapi]
pub fn nstd_env_current_dir() -> NSTDIOStringResult<'static> {
match std::env::current_dir() {
Ok(dir) => dir.to_str().map_or(
NSTDResult::Err(NSTDIOError::NSTD_IO_ERROR_INVALID_DATA),
|dir| NSTDResult::Ok(NSTDString::from_string(dir.into())),
),
Err(err) => NSTDResult::Err(NSTDIOError::from_err(err.kind())),
}
}
#[nstdapi]
pub fn nstd_env_current_exe() -> NSTDIOStringResult<'static> {
match std::env::current_exe() {
Ok(exe) => exe.to_str().map_or(
NSTDResult::Err(NSTDIOError::NSTD_IO_ERROR_INVALID_DATA),
|exe| NSTDResult::Ok(NSTDString::from_string(exe.into())),
),
Err(err) => NSTDResult::Err(NSTDIOError::from_err(err.kind())),
}
}
#[nstdapi]
pub fn nstd_env_temp_dir() -> NSTDOptionalString<'static> {
std::env::temp_dir()
.to_str()
.map_or(NSTDOptional::None, |temp| {
NSTDOptional::Some(NSTDString::from_string(temp.into()))
})
}
#[nstdapi]
pub unsafe fn nstd_env_set_current_dir(path: &NSTDStr) -> NSTDIOError {
match std::env::set_current_dir(path.as_str()) {
Err(err) => NSTDIOError::from_err(err.kind()),
_ => NSTDIOError::NSTD_IO_ERROR_NONE,
}
}
#[nstdapi]
pub unsafe fn nstd_env_var(key: &NSTDStr) -> NSTDIOStringResult<'_> {
match std::env::var(key.as_str()) {
Ok(var) => NSTDResult::Ok(NSTDString::from_string(var)),
Err(VarError::NotPresent) => NSTDResult::Err(NSTDIOError::NSTD_IO_ERROR_NOT_FOUND),
Err(VarError::NotUnicode(_)) => NSTDResult::Err(NSTDIOError::NSTD_IO_ERROR_INVALID_DATA),
}
}
#[inline]
#[nstdapi]
pub unsafe fn nstd_env_set_var(key: &NSTDStr, value: &NSTDStr) {
std::env::set_var(key.as_str(), value.as_str());
}
#[inline]
#[nstdapi]
pub unsafe fn nstd_env_remove_var(key: &NSTDStr) {
std::env::remove_var(key.as_str());
}
#[nstdapi]
pub fn nstd_env_args() -> NSTDVec<'static> {
let size = core::mem::size_of::<NSTDString<'_>>();
let align = core::mem::align_of::<NSTDString<'_>>();
let mut args = nstd_vec_new(&NSTD_ALLOCATOR, size, align);
for arg in std::env::args() {
let arg = NSTDString::from_string(arg);
let errc = unsafe { nstd_vec_push(&mut args, addr_of!(arg).cast()) };
if errc == NSTD_ALLOC_ERROR_NONE {
core::mem::forget(arg);
}
}
args
}
#[nstdapi]
pub fn nstd_env_vars() -> NSTDVec<'static> {
let size = core::mem::size_of::<[NSTDString<'_>; 2]>();
let align = core::mem::align_of::<[NSTDString<'_>; 2]>();
let mut vars = nstd_vec_new(&NSTD_ALLOCATOR, size, align);
for (k, v) in std::env::vars() {
let var = [NSTDString::from_string(k), NSTDString::from_string(v)];
let errc = unsafe { nstd_vec_push(&mut vars, addr_of!(var).cast()) };
if errc == NSTD_ALLOC_ERROR_NONE {
core::mem::forget(var);
}
}
vars
}