pub mod cli_utils {
use crate::base::{RUMResult, RUMVec};
use crate::cpu::CPU_PAGE_SIZE;
use crate::strings::rumtk_format;
use std::io::{stdin, stdout, BufWriter, Read, Write};
use std::os::fd::{AsRawFd, FromRawFd};
const STD_IN_STEP_SIZE: usize = u16::MAX as usize;
pub type BufferSlice = Vec<u8>;
pub type BufferChunk = [u8; STD_IN_STEP_SIZE];
pub fn read_stdin(minimum_size: usize) -> RUMResult<RUMVec<u8>> {
let mut stdin_buffer = RUMVec::with_capacity(minimum_size);
loop {
let s = read_some_stdin(&mut stdin_buffer)?;
if s == 0 {
break;
}
}
Ok(stdin_buffer)
}
#[inline]
pub fn read_some_stdin(buf: &mut BufferSlice) -> RUMResult<usize> {
let mut chunk: BufferChunk = [0; STD_IN_STEP_SIZE];
match stdin().read(&mut chunk[..]) {
Ok(s) => {
buf.extend_from_slice(&chunk[..s]);
Ok(s)
}
Err(e) => Err(rumtk_format!("Error reading stdin chunk because {}!", e)),
}
}
pub fn write_string_stdout(data: &str) -> RUMResult<()> {
write_stdout(&data.as_bytes())
}
#[cfg(target_os = "windows")]
pub fn write_stdout(data: &[u8]) -> RUMResult<()> {
match stdout().write_all(data) {
Ok(_) => {}
Err(e) => return Err(rumtk_format!("Error writing to stdout because => {}", e)),
};
flush_stdout()?;
Ok(())
}
#[cfg(any(target_os = "unix", target_os = "linux", target_os = "macos"))]
pub fn write_stdout(data: &[u8]) -> RUMResult<()> {
let stdout_fd = stdout().as_raw_fd();
{
let mut file = BufWriter::new(unsafe { std::fs::File::from_raw_fd(stdout_fd) });
match file.write_all(data) {
Ok(_) => {
file.flush().unwrap_or_default();
std::mem::forget(file);
},
Err(e) => return Err(rumtk_format!("Error writing to stdout because {}", e)),
};
}
flush_stdout()?;
Ok(())
}
fn flush_stdout() -> RUMResult<()> {
match stdout().flush() {
Ok(_) => Ok(()),
Err(e) => Err(rumtk_format!("Error flushing stdout because => {}", e)),
}
}
pub fn print_license_notice(program: &str, year: &str, author_list: &Vec<&str>) {
let authors = author_list.join(", ");
let notice = rumtk_format!(
r" {program} Copyright (C) {year} {authors}
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions."
);
eprintln!("{}", notice);
}
}
pub mod macros {
#[macro_export]
macro_rules! rumtk_read_stdin {
( ) => {{
use $crate::cpu::CPU_PAGE_SIZE;
use $crate::cli::cli_utils::{read_stdin};
read_stdin(CPU_PAGE_SIZE * CPU_PAGE_SIZE)
}};
( $min_expected_size:expr ) => {{
use $crate::cli::cli_utils::{read_stdin};
read_stdin($min_expected_size)
}};
}
#[macro_export]
macro_rules! rumtk_write_stdout {
( $message:expr ) => {{
use $crate::cli::cli_utils::write_string_stdout;
write_string_stdout(&$message)
}};
( $message:expr, $binary:expr ) => {{
use $crate::cli::cli_utils::write_stdout;
write_stdout(&$message)
}};
}
#[macro_export]
macro_rules! rumtk_print_license_notice {
( ) => {{
use $crate::cli::cli_utils::print_license_notice;
print_license_notice("RUMTK", "2025", &vec!["Luis M. Santos, M.D."]);
}};
( $program:expr ) => {{
use $crate::cli::cli_utils::print_license_notice;
print_license_notice(&$program, "2025", &vec!["2025", "Luis M. Santos, M.D."]);
}};
( $program:expr, $year:expr ) => {{
use $crate::cli::cli_utils::print_license_notice;
print_license_notice(&$program, &$year, &vec!["Luis M. Santos, M.D."]);
}};
( $program:expr, $year:expr, $authors:expr ) => {{
use $crate::cli::cli_utils::print_license_notice;
print_license_notice(&$program, &$year, &$authors);
}};
}
}