Documentation
#[cfg(windows)]
pub async fn get_hostname() -> crate::error::Result<String> {
    use serde::Deserialize;

    use crate::platform::wmi_query;

    #[derive(Deserialize, Debug, Clone)]
    #[serde(rename = "Win32_ComputerSystem")]
    struct ComputerSystem {
        #[serde(rename = "Name")]
        name: String,
    }

    let results: Vec<ComputerSystem> = wmi_query().await?;

    results
        .first()
        .map(|i| i.name.clone())
        .ok_or_else(|| crate::error::NeofetchError::data_unavailable("Hostname not found"))
}

#[cfg(not(windows))]
pub async fn get_hostname() -> crate::error::Result<String> {
    use std::ffi::CStr;

    let mut buffer = vec![0u8; 256];

    let result =
        unsafe { libc::gethostname(buffer.as_mut_ptr() as *mut libc::c_char, buffer.len()) };

    if result != 0 {
        return Err(crate::error::NeofetchError::system_call(
            "Failed to get hostname from gethostname",
        ));
    }

    let hostname = unsafe {
        CStr::from_ptr(buffer.as_ptr() as *const libc::c_char)
            .to_string_lossy()
            .into_owned()
    };

    Ok(hostname)
}