microfetch 0.4.13

Microscopic fetch tool in Rust, for NixOS systems, with special emphasis on speed
Documentation
use std::{ffi::CStr, fmt::Write};

#[must_use]
#[cfg_attr(feature = "hotpath", hotpath::measure)]
pub fn get_desktop_info() -> String {
  // Retrieve the environment variables and handle Result types
  let desktop_str = unsafe {
    let ptr = libc::getenv(c"XDG_CURRENT_DESKTOP".as_ptr());
    if ptr.is_null() {
      "Unknown"
    } else {
      let s = CStr::from_ptr(ptr).to_str().unwrap_or("Unknown");
      s.strip_prefix("none+").unwrap_or(s)
    }
  };

  let backend_str = unsafe {
    let ptr = libc::getenv(c"XDG_SESSION_TYPE".as_ptr());
    if ptr.is_null() {
      "Unknown"
    } else {
      let s = CStr::from_ptr(ptr).to_str().unwrap_or("Unknown");
      if s.is_empty() { "Unknown" } else { s }
    }
  };

  // Pre-calculate capacity: desktop_len + " (" + backend_len + ")"
  // Capitalize first char needs temporary allocation only if backend exists
  let mut result =
    String::with_capacity(desktop_str.len() + backend_str.len() + 3);
  result.push_str(desktop_str);
  result.push_str(" (");

  // Capitalize first character of backend
  if let Some(first_char) = backend_str.chars().next() {
    let _ = write!(result, "{}", first_char.to_ascii_uppercase());
    result.push_str(&backend_str[first_char.len_utf8()..]);
  }

  result.push(')');
  result
}