#![warn(missing_docs)]
#![allow(clippy::style)]
use core::{net, time};
const READ_TIMEOUT: time::Duration = time::Duration::from_secs(1);
pub const DEFAULT_LOCAL_IP: net::IpAddr = net::IpAddr::V4(net::Ipv4Addr::UNSPECIFIED);
#[cfg(feature = "tracing")]
#[macro_export]
#[doc(hidden)]
macro_rules! info {
($($input:tt)*) => {
::tracing::info!($($input)*)
};
}
#[cfg(all(not(debug_assertions), not(feature = "tracing")))]
#[macro_export]
#[doc(hidden)]
macro_rules! info {
($($input:tt)*) => {
#[allow(unused)]
let _ = (
$($input)*
);
};
}
#[cfg(all(debug_assertions, not(feature = "tracing")))]
#[macro_export]
#[doc(hidden)]
macro_rules! info {
($($input:tt)*) => {
::std::println!($($input)*)
};
}
#[cfg(feature = "tracing")]
#[macro_export]
#[doc(hidden)]
macro_rules! error {
($($input:tt)*) => {
::tracing::error!($($input)*)
};
}
#[cfg(all(not(debug_assertions), not(feature = "tracing")))]
#[macro_export]
#[doc(hidden)]
macro_rules! error {
($($input:tt)*) => {
#[allow(unused)]
let _ = (
$($input)*
);
};
}
#[cfg(all(debug_assertions, not(feature = "tracing")))]
#[macro_export]
#[doc(hidden)]
macro_rules! error {
($($input:tt)*) => {
::std::eprintln!($($input)*)
};
}
macro_rules! io_error {
($error:expr, $description:literal) => {
use ::std::io::ErrorKind;
let error = $error;
if !::core::matches!(error.kind(), ErrorKind::BrokenPipe | ErrorKind::NotConnected) {
error!("{}(kind={:?}): {}", $description, error.kind(), error);
} else {
info!("{}(kind={:?}): {}", $description, error.kind(), error);
}
};
($error:expr, $description:literal, $addr:expr) => {
use ::std::io::ErrorKind;
let error = $error;
if !::core::matches!(error.kind(), ErrorKind::BrokenPipe | ErrorKind::NotConnected) {
error!("{}: {}(kind={:?}): {}", $addr, $description, error.kind(), error);
} else {
info!("{}: {}(kind={:?}): {}", $addr, $description, error.kind(), error);
}
};
}
mod utils;
mod ip;
pub use ip::IpEcho;
mod echo;
pub use echo::Echo;