#![warn(unused_results)]
use std::ffi::{OsStr, OsString};
use crate::{PlatformInfoAPI, PlatformInfoError, UNameAPI};
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct PlatformInfo {
sysname: OsString,
nodename: OsString,
release: OsString,
version: OsString,
machine: OsString,
processor: OsString,
osname: OsString,
}
fn detect_nodename() -> OsString {
for var in &["HOSTNAME", "COMPUTERNAME"] {
if let Ok(val) = std::env::var(var) {
if !val.is_empty() {
return OsString::from(val);
}
}
}
OsString::from("localhost")
}
impl PlatformInfoAPI for PlatformInfo {
fn new() -> Result<Self, PlatformInfoError> {
Ok(Self {
sysname: OsString::from("wasi"),
nodename: detect_nodename(),
release: OsString::from("0.0.0"),
version: OsString::from("0.0.0"),
machine: OsString::from(std::env::consts::ARCH),
processor: OsString::from(crate::lib_impl::map_processor(std::env::consts::ARCH)),
osname: OsString::from(crate::lib_impl::HOST_OS_NAME),
})
}
}
impl UNameAPI for PlatformInfo {
fn sysname(&self) -> &OsStr {
&self.sysname
}
fn nodename(&self) -> &OsStr {
&self.nodename
}
fn release(&self) -> &OsStr {
&self.release
}
fn version(&self) -> &OsStr {
&self.version
}
fn machine(&self) -> &OsStr {
&self.machine
}
fn processor(&self) -> &OsStr {
&self.processor
}
fn osname(&self) -> &OsStr {
&self.osname
}
}
#[test]
fn test_wasi() {
let info = PlatformInfo::new().unwrap();
assert_eq!(info.sysname().to_string_lossy(), "wasi");
assert!(!info.nodename().to_string_lossy().is_empty());
assert_eq!(info.release().to_string_lossy(), "0.0.0");
assert_eq!(info.version().to_string_lossy(), "0.0.0");
assert_eq!(info.machine().to_string_lossy(), std::env::consts::ARCH);
}
#[test]
fn test_wasi_nodename_env() {
let orig = std::env::var("HOSTNAME").ok();
unsafe {
std::env::set_var("HOSTNAME", "my-wasi-host");
}
let info = PlatformInfo::new().unwrap();
assert_eq!(info.nodename().to_string_lossy(), "my-wasi-host");
unsafe {
std::env::remove_var("HOSTNAME");
std::env::remove_var("COMPUTERNAME");
}
let info = PlatformInfo::new().unwrap();
assert_eq!(info.nodename().to_string_lossy(), "localhost");
unsafe {
match orig {
Some(v) => std::env::set_var("HOSTNAME", v),
None => std::env::remove_var("HOSTNAME"),
}
}
}
#[test]
fn structure_clone() {
let info = PlatformInfo::new().unwrap();
println!("{:?}", info);
let info_copy = info.clone();
assert_eq!(info_copy, info);
}