From 263cb0a5e3cd7dffc8fd72b8492452a05d928734 Mon Sep 17 00:00:00 2001 From: Thomas Voss Date: Wed, 2 Aug 2023 04:18:16 +0200 Subject: Genesis commit --- src/lib.rs | 124 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 src/lib.rs (limited to 'src') diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..685c023 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,124 @@ +#![doc = include_str!("../README.md")] + +#[doc(hidden)] +pub use std::{env, process}; + +/// Print a diagnostic message to stderr and exit with a given code. +/// +/// This macro is analagous to the BSD [`errx(3)`] C function. It takes at a +/// minimum two arguments. The first argument is the code with passed to +/// [`std::process::exit()`] with which we exit the program. The second and +/// optional additional arguments are passed to the [`eprintln!`] macro. +/// +/// When invoked, the given format and arguments are printed to the standard +/// error, prepended by the string `"progname: "`, where `progname` is the +/// program name as defined by the first element in [`std::env::args`]. If for +/// whatever reason no such element exists (which is possible), we default to +/// simply using `"Error"` as the program name. +/// +/// If you do not care about specifying a specific exit code and are fine with +/// simply defaulting to `1`, you may prefer to use [`err!`]. +/// +/// # Panics +/// +/// Calls [`eprint!`], [`eprintln!`], and [`std::env::args`] which may all panic +/// if they fail. +/// +/// # Examples +/// +/// Print a diagnostic in the form `progname: path: error`, and then exit the +/// program with an exit status of 2. +/// +/// ``` +/// use std::fs; +/// use cerm::err_code; +/// +/// let res = match fs::create_dir(&path) { +/// Ok(v) => v, +/// Err(e) => { err_code!(2, "{}: {}", path, e); } +/// }; +/// ``` +/// +/// [`errx(3)`]: https://man.openbsd.org/err.3 +#[macro_export] +macro_rules! err_code { + ($code:tt, $($fmt:tt)+) => { + eprint!("{}: ", $crate::env::args().next().unwrap_or("Error".into())); + eprintln!($($fmt)*); + $crate::process::exit($code); + }; +} + +/// The same thing as [`err_code!`], but the exit code is always 1. +/// +/// This macro is simply a wrapper around [`err_code!`], but with `1` passed as +/// the first argument; everything else is the same. For documentation on this +/// macro, read the documentation for [`err_code!`] instead. +/// +/// # Panics +/// +/// Calls [`err!`] which may panic if it fails. +/// +/// # Examples +/// +/// Print a diagnostic in the form `progname: path: error`, and then exit the +/// program with an exit status of 1. +/// +/// ``` +/// use std::fs; +/// use cerm::err_code; +/// +/// let res = match fs::create_dir(&path) { +/// Ok(v) => v, +/// Err(e) => { err!("{}: {}", path, e); } +/// }; +/// ``` +#[macro_export] +macro_rules! err { + ($($fmt:tt)+) => { + $crate::err_code!(1, $($fmt)*); + } +} + +/// Print a diagnostic message to stderr +/// +/// This macro is analagous to the BSD [`warnx(3)`] C function. It takes the +/// same arguments one would pass to a macro like [`println!`]. In fact, the +/// arguments are passed directly to [`eprintln]`. +/// +/// When invoked, the given format and arguments are printed to the standard +/// error, prepended by the string `"progname: "`, where `progname` is the +/// program name as defined by the first element in [`std::env::args`]. If for +/// whatever reason no such element exists (which is possible), we default to +/// simply using `"Error"` as the program name. +/// +/// # Panics +/// +/// Calls [`eprint!`], [`eprintln!`], and [`std::env::args`] which may all panic +/// if they fail. +/// +/// # Examples +/// +/// Print a diagnostic in the form `progname: path: error` +/// +/// ``` +/// use std::fs; +/// use cerm::warn; +/// +/// let res = match fs::create_dir(&path) { +/// Ok(v) => v, +/// Err(e) => { +/// warn!("{}: {}", path, e); +/// /* … */ +/// } +/// }; +/// ``` +/// +/// [`errx(3)`]: https://man.openbsd.org/err.3 +#[macro_export] +macro_rules! warn { + ($($fmt:tt)+) => { + eprint!("{}: ", $crate::env::args().next().unwrap_or("Error".into())); + eprintln!($($fmt)*); + }; +} -- cgit v1.2.3