#[cfg(windows)]
pub async fn get_user() -> crate::error::Result<String> {
use serde::Deserialize;
use crate::platform::wmi_query;
#[derive(Deserialize, Debug, Clone)]
#[serde(rename = "Win32_ComputerSystem")]
struct ComputerSystem {
#[serde(rename = "UserName")]
user_name: Option<String>,
}
let results: Vec<ComputerSystem> = wmi_query().await?;
let name = results
.first()
.and_then(|i| i.user_name.clone())
.ok_or_else(|| crate::error::NeofetchError::data_unavailable("User name not found"))?;
let username = name
.split("\\")
.last()
.map(|i| i.to_owned())
.ok_or_else(|| {
crate::error::NeofetchError::parse_error("username", "Invalid username format")
})?;
Ok(username)
}
#[cfg(unix)]
pub async fn get_user() -> crate::error::Result<String> {
use std::ffi::CStr;
let uid = unsafe { libc::getuid() };
let passwd = unsafe { libc::getpwuid(uid) };
if passwd.is_null() {
return Err(crate::error::NeofetchError::system_call(
"Failed to get user information from getpwuid",
));
}
let username = unsafe {
CStr::from_ptr((*passwd).pw_name)
.to_string_lossy()
.into_owned()
};
if !username.is_empty() {
return Ok(username);
}
if let Ok(s) = std::env::var("username") {
return Ok(s);
}
if let Ok(s) = std::env::var("HOME") {
let name = s.replace('\\', "/");
if let Some(name) = name.split('/').next_back() {
return Ok(name.into());
}
}
Err(crate::error::NeofetchError::data_unavailable(
"User information not available",
))
}