diff --git a/crates/anstream/src/_macros.rs b/crates/anstream/src/_macros.rs index bd1accb..76ae7d7 100644 --- a/crates/anstream/src/_macros.rs +++ b/crates/anstream/src/_macros.rs @@ -61,17 +61,8 @@ macro_rules! print { ($($arg:tt)*) => {{ if cfg!(any(feature = "test", test)) { - use std::io::Write as _; - - let stdio = std::io::stdout(); - let choice = $crate::AutoStream::choice(&stdio); - let buffer = Vec::new(); - let mut stream = $crate::AutoStream::new(buffer, choice); - // Ignore errors rather than panic - let _ = ::std::write!(&mut stream, $($arg)*); - let buffer = stream.into_inner(); - // Should be UTF-8 but not wanting to panic - let buffer = String::from_utf8_lossy(&buffer); + let target_stream = std::io::stdout(); + let buffer = $crate::_macros::to_adapted_string(&format_args!($($arg)*), &target_stream); ::std::print!("{}", buffer) } else { use std::io::Write as _; @@ -142,17 +133,8 @@ macro_rules! println { }; ($($arg:tt)*) => {{ if cfg!(any(feature = "test", test)) { - use std::io::Write as _; - - let stdio = std::io::stdout(); - let choice = $crate::AutoStream::choice(&stdio); - let buffer = Vec::new(); - let mut stream = $crate::AutoStream::new(buffer, choice); - // Ignore errors rather than panic - let _ = ::std::write!(&mut stream, $($arg)*); - let buffer = stream.into_inner(); - // Should be UTF-8 but not wanting to panic - let buffer = String::from_utf8_lossy(&buffer); + let target_stream = std::io::stdout(); + let buffer = $crate::_macros::to_adapted_string(&format_args!($($arg)*), &target_stream); ::std::println!("{}", buffer) } else { use std::io::Write as _; @@ -202,17 +184,8 @@ macro_rules! println { macro_rules! eprint { ($($arg:tt)*) => {{ if cfg!(any(feature = "test", test)) { - use std::io::Write as _; - - let stdio = std::io::stderr(); - let choice = $crate::AutoStream::choice(&stdio); - let buffer = Vec::new(); - let mut stream = $crate::AutoStream::new(buffer, choice); - // Ignore errors rather than panic - let _ = ::std::write!(&mut stream, $($arg)*); - let buffer = stream.into_inner(); - // Should be UTF-8 but not wanting to panic - let buffer = String::from_utf8_lossy(&buffer); + let target_stream = std::io::stderr(); + let buffer = $crate::_macros::to_adapted_string(&format_args!($($arg)*), &target_stream); ::std::eprint!("{}", buffer) } else { use std::io::Write as _; @@ -265,17 +238,8 @@ macro_rules! eprintln { }; ($($arg:tt)*) => {{ if cfg!(any(feature = "test", test)) { - use std::io::Write as _; - - let stdio = std::io::stderr(); - let choice = $crate::AutoStream::choice(&stdio); - let buffer = Vec::new(); - let mut stream = $crate::AutoStream::new(buffer, choice); - // Ignore errors rather than panic - let _ = ::std::write!(&mut stream, $($arg)*); - let buffer = stream.into_inner(); - // Should be UTF-8 but not wanting to panic - let buffer = String::from_utf8_lossy(&buffer); + let target_stream = std::io::stderr(); + let buffer = $crate::_macros::to_adapted_string(&format_args!($($arg)*), &target_stream); ::std::eprintln!("{}", buffer) } else { use std::io::Write as _; @@ -373,17 +337,26 @@ macro_rules! panic { ::std::panic!() }; ($($arg:tt)*) => {{ - use std::io::Write as _; - - let panic_stream = std::io::stderr(); - let choice = $crate::AutoStream::choice(&panic_stream); - let buffer = Vec::new(); - let mut stream = $crate::AutoStream::new(buffer, choice); - // Ignore errors rather than panic - let _ = ::std::write!(&mut stream, $($arg)*); - let buffer = stream.into_inner(); - // Should be UTF-8 but not wanting to panic - let buffer = String::from_utf8_lossy(&buffer).into_owned(); + let target_stream = std::io::stderr(); + let buffer = $crate::_macros::to_adapted_string(&format_args!($($arg)*), &target_stream); ::std::panic!("{}", buffer) }}; } + +#[cfg(feature = "auto")] +pub fn to_adapted_string( + display: &dyn std::fmt::Display, + stream: &impl crate::stream::RawStream, +) -> String { + use std::io::Write as _; + + let choice = crate::AutoStream::choice(stream); + let buffer = Vec::new(); + let mut stream = crate::AutoStream::new(buffer, choice); + // Ignore errors rather than panic + let _ = ::std::write!(&mut stream, "{display}"); + let buffer = stream.into_inner(); + // Should be UTF-8 but not wanting to panic + let buffer = String::from_utf8_lossy(&buffer).into_owned(); + buffer +} diff --git a/crates/anstream/src/lib.rs b/crates/anstream/src/lib.rs index f04a2a9..73ff8bf 100644 --- a/crates/anstream/src/lib.rs +++ b/crates/anstream/src/lib.rs @@ -38,11 +38,12 @@ pub mod adapter; pub mod stream; - -mod buffer; +#[doc(hidden)] #[macro_use] -mod _macros; +pub mod _macros; + mod auto; +mod buffer; mod fmt; mod strip; #[cfg(all(windows, feature = "wincon"))]