use crate::{
alloc::CBox,
core::{
optional::{gen_optional, NSTDOptional},
slice::NSTDSlice,
},
io::{NSTDIOError, NSTDIOResult},
};
use nstdapi::nstdapi;
use std::io::{Stderr, StderrLock};
#[cfg(unix)]
use std::os::unix::io::AsRawFd;
#[nstdapi]
pub struct NSTDStderr {
err: CBox<Stderr>,
}
gen_optional!(NSTDOptionalStderr, NSTDStderr);
#[inline]
#[nstdapi]
pub fn nstd_io_stderr() -> NSTDOptionalStderr {
CBox::new(std::io::stderr()).map_or(NSTDOptional::None, |err| {
NSTDOptional::Some(NSTDStderr { err })
})
}
#[inline]
#[nstdapi]
pub unsafe fn nstd_io_stderr_write(handle: &mut NSTDStderr, bytes: &NSTDSlice) -> NSTDIOResult {
#[cfg(not(unix))]
return crate::io::stdio::write(&mut *handle.err, bytes);
#[cfg(unix)]
return crate::os::unix::io::stdio::write(handle.err.lock().as_raw_fd(), bytes).into();
}
#[inline]
#[nstdapi]
pub unsafe fn nstd_io_stderr_write_all(handle: &mut NSTDStderr, bytes: &NSTDSlice) -> NSTDIOError {
#[cfg(not(unix))]
return crate::io::stdio::write_all(&mut *handle.err, bytes);
#[cfg(unix)]
return crate::os::unix::io::stdio::write_all(handle.err.lock().as_raw_fd(), bytes).into();
}
#[inline]
#[nstdapi]
pub fn nstd_io_stderr_flush(handle: &mut NSTDStderr) -> NSTDIOError {
crate::io::stdio::flush(&mut *handle.err)
}
#[inline]
#[nstdapi]
#[allow(
unused_variables,
clippy::missing_const_for_fn,
clippy::needless_pass_by_value
)]
pub fn nstd_io_stderr_free(handle: NSTDStderr) {}
#[nstdapi]
pub struct NSTDStderrLock {
err: CBox<StderrLock<'static>>,
}
gen_optional!(NSTDOptionalStderrLock, NSTDStderrLock);
#[inline]
#[nstdapi]
pub fn nstd_io_stderr_lock() -> NSTDOptionalStderrLock {
CBox::new(std::io::stderr().lock()).map_or(NSTDOptional::None, |err| {
NSTDOptional::Some(NSTDStderrLock { err })
})
}
#[inline]
#[nstdapi]
pub unsafe fn nstd_io_stderr_lock_write(
handle: &mut NSTDStderrLock,
bytes: &NSTDSlice,
) -> NSTDIOResult {
#[cfg(not(unix))]
return crate::io::stdio::write(&mut *handle.err, bytes);
#[cfg(unix)]
return crate::os::unix::io::stdio::write(handle.err.as_raw_fd(), bytes).into();
}
#[inline]
#[nstdapi]
pub unsafe fn nstd_io_stderr_lock_write_all(
handle: &mut NSTDStderrLock,
bytes: &NSTDSlice,
) -> NSTDIOError {
#[cfg(not(unix))]
return crate::io::stdio::write_all(&mut *handle.err, bytes);
#[cfg(unix)]
return crate::os::unix::io::stdio::write_all(handle.err.as_raw_fd(), bytes).into();
}
#[inline]
#[nstdapi]
pub fn nstd_io_stderr_lock_flush(handle: &mut NSTDStderrLock) -> NSTDIOError {
crate::io::stdio::flush(&mut *handle.err)
}
#[inline]
#[nstdapi]
#[allow(
unused_variables,
clippy::missing_const_for_fn,
clippy::needless_pass_by_value
)]
pub fn nstd_io_stderr_unlock(handle: NSTDStderrLock) {}