use crate::{
alloc::CBox,
core::{
optional::{gen_optional, NSTDOptional},
slice::NSTDSlice,
},
io::{NSTDIOError, NSTDIOResult},
};
use nstdapi::nstdapi;
use std::io::{Stdout, StdoutLock};
#[cfg(unix)]
use std::os::unix::io::AsRawFd;
#[nstdapi]
pub struct NSTDStdout {
out: CBox<Stdout>,
}
gen_optional!(NSTDOptionalStdout, NSTDStdout);
#[inline]
#[nstdapi]
pub fn nstd_io_stdout() -> NSTDOptionalStdout {
CBox::new(std::io::stdout()).map_or(NSTDOptional::None, |out| {
NSTDOptional::Some(NSTDStdout { out })
})
}
#[inline]
#[nstdapi]
pub unsafe fn nstd_io_stdout_write(handle: &mut NSTDStdout, bytes: &NSTDSlice) -> NSTDIOResult {
#[cfg(not(unix))]
return crate::io::stdio::write(&mut *handle.out, bytes);
#[cfg(unix)]
return crate::os::unix::io::stdio::write(handle.out.lock().as_raw_fd(), bytes).into();
}
#[inline]
#[nstdapi]
pub unsafe fn nstd_io_stdout_write_all(handle: &mut NSTDStdout, bytes: &NSTDSlice) -> NSTDIOError {
#[cfg(not(unix))]
return crate::io::stdio::write_all(&mut *handle.out, bytes);
#[cfg(unix)]
return crate::os::unix::io::stdio::write_all(handle.out.lock().as_raw_fd(), bytes).into();
}
#[inline]
#[nstdapi]
pub fn nstd_io_stdout_flush(handle: &mut NSTDStdout) -> NSTDIOError {
crate::io::stdio::flush(&mut *handle.out)
}
#[inline]
#[nstdapi]
#[allow(
unused_variables,
clippy::missing_const_for_fn,
clippy::needless_pass_by_value
)]
pub fn nstd_io_stdout_free(handle: NSTDStdout) {}
#[nstdapi]
pub struct NSTDStdoutLock {
out: CBox<StdoutLock<'static>>,
}
gen_optional!(NSTDOptionalStdoutLock, NSTDStdoutLock);
#[inline]
#[nstdapi]
pub fn nstd_io_stdout_lock() -> NSTDOptionalStdoutLock {
CBox::new(std::io::stdout().lock()).map_or(NSTDOptional::None, |out| {
NSTDOptional::Some(NSTDStdoutLock { out })
})
}
#[inline]
#[nstdapi]
pub unsafe fn nstd_io_stdout_lock_write(
handle: &mut NSTDStdoutLock,
bytes: &NSTDSlice,
) -> NSTDIOResult {
#[cfg(not(unix))]
return crate::io::stdio::write(&mut *handle.out, bytes);
#[cfg(unix)]
return crate::os::unix::io::stdio::write(handle.out.as_raw_fd(), bytes).into();
}
#[inline]
#[nstdapi]
pub unsafe fn nstd_io_stdout_lock_write_all(
handle: &mut NSTDStdoutLock,
bytes: &NSTDSlice,
) -> NSTDIOError {
#[cfg(not(unix))]
return crate::io::stdio::write_all(&mut *handle.out, bytes);
#[cfg(unix)]
return crate::os::unix::io::stdio::write_all(handle.out.as_raw_fd(), bytes).into();
}
#[inline]
#[nstdapi]
pub fn nstd_io_stdout_lock_flush(handle: &mut NSTDStdoutLock) -> NSTDIOError {
crate::io::stdio::flush(&mut *handle.out)
}
#[inline]
#[nstdapi]
#[allow(
unused_variables,
clippy::missing_const_for_fn,
clippy::needless_pass_by_value
)]
pub fn nstd_io_stdout_unlock(handle: NSTDStdoutLock) {}