pub fn machine_name() -> Option<String> {
std::env::var("HOSTNAME")
.ok()
.and_then(|value| short_name(&value))
.or_else(|| short_name(&gethostname::gethostname().to_string_lossy()))
}
fn short_name(raw: &str) -> Option<String> {
let trimmed = raw.trim();
let short = trimmed.split('.').next().unwrap_or(trimmed).trim();
(!short.is_empty()).then(|| short.to_string())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn the_domain_half_is_dropped() {
assert_eq!(short_name("laptop.local").as_deref(), Some("laptop"));
assert_eq!(short_name("build-01.internal.example").as_deref(), Some("build-01"));
assert_eq!(short_name(" plain ").as_deref(), Some("plain"));
}
#[test]
fn nothing_usable_is_none() {
assert_eq!(short_name(""), None);
assert_eq!(short_name(" "), None);
assert_eq!(short_name(".local"), None);
}
#[test]
fn this_machine_answers_with_something_usable_or_nothing() {
if let Some(name) = machine_name() {
assert!(!name.is_empty());
assert!(!name.contains('.'));
assert_eq!(name.trim(), name);
}
}
}