#[must_use]
#[allow(dead_code)]
pub fn get_thread_id() -> u64 {
use std::thread;
format!("{:?}", thread::current().id())
.chars()
.filter_map(|c| c.to_digit(10))
.map(|d| d as u64)
.fold(0, |acc, d| acc * 10 + d)
}
#[must_use]
#[allow(dead_code)]
pub fn get_hostname() -> String {
std::env::var("HOSTNAME")
.or_else(|_| std::env::var("COMPUTERNAME"))
.unwrap_or_else(|_| "unknown".to_string())
}
#[must_use]
#[allow(dead_code)]
pub fn get_local_ip() -> Option<String> {
#[cfg(feature = "sysinfo")]
{
use std::net::TcpStream;
if let Ok(stream) = TcpStream::connect("8.8.8.8:80") {
if let Ok(local_addr) = stream.local_addr() {
return Some(local_addr.ip().to_string());
}
}
Some("127.0.0.1".to_string())
}
#[cfg(not(feature = "sysinfo"))]
{
use std::env;
if let Ok(ip) = env::var("HOST_IP") {
return Some(ip);
}
if let Ok(ip) = env::var("LOCAL_IP") {
return Some(ip);
}
Some("127.0.0.1".to_string())
}
}
#[must_use]
#[allow(dead_code)]
pub fn get_stack_trace() -> String {
let mut result = String::new();
result.push_str("Stack trace (simplified):\n");
if let Some(name) = std::thread::current().name() {
result.push_str(&format!(" Thread: {name}\n"));
} else {
result.push_str(" Thread: <unnamed>\n");
}
result.push_str(&format!(
" Location: {}:{}:{}\n",
file!(),
line!(),
column!()
));
result
}