use crate::metal::generated_struct_types::OperatingSystemVersion;
use crate::metal::generated_value_types::ProcessInfoThermalState;
use crate::{Error, ThreadBound};
use objc2::rc::Retained;
use objc2::{msg_send, sel};
use objc2_foundation::{NSObjectProtocol, NSOperatingSystemVersion, NSProcessInfo, NSString};
pub struct ProcessInfo {
inner: Retained<NSProcessInfo>,
_thread_bound: ThreadBound,
}
impl ProcessInfo {
#[must_use]
pub fn current() -> Self {
Self {
inner: NSProcessInfo::processInfo(),
_thread_bound: ThreadBound::new(),
}
}
pub fn set_process_name(&self, name: &str) {
self.inner.setProcessName(&NSString::from_str(name));
}
#[must_use]
pub fn process_identifier(&self) -> i32 {
self.inner.processIdentifier()
}
#[must_use]
pub fn operating_system_version(&self) -> OperatingSystemVersion {
let value = self.inner.operatingSystemVersion();
OperatingSystemVersion {
major_version: value.majorVersion,
minor_version: value.minorVersion,
patch_version: value.patchVersion,
}
}
#[must_use]
pub fn is_operating_system_at_least(&self, version: &OperatingSystemVersion) -> bool {
self.inner
.isOperatingSystemAtLeastVersion(NSOperatingSystemVersion {
majorVersion: version.major_version,
minorVersion: version.minor_version,
patchVersion: version.patch_version,
})
}
#[must_use]
pub fn processor_count(&self) -> usize {
self.inner.processorCount()
}
#[must_use]
pub fn active_processor_count(&self) -> usize {
self.inner.activeProcessorCount()
}
#[must_use]
pub fn physical_memory(&self) -> u64 {
self.inner.physicalMemory()
}
#[must_use]
pub fn system_uptime(&self) -> f64 {
self.inner.systemUptime()
}
pub fn disable_sudden_termination(&self) {
self.inner.disableSuddenTermination();
}
pub fn enable_sudden_termination(&self) {
self.inner.enableSuddenTermination();
}
#[must_use]
pub fn automatic_termination_support_enabled(&self) -> bool {
self.inner.automaticTerminationSupportEnabled()
}
pub fn set_automatic_termination_support_enabled(&self, enabled: bool) {
self.inner.setAutomaticTerminationSupportEnabled(enabled);
}
#[must_use]
pub fn thermal_state(&self) -> ProcessInfoThermalState {
ProcessInfoThermalState::from_system_raw(self.inner.thermalState().0)
}
#[must_use]
pub fn is_low_power_mode_enabled(&self) -> bool {
self.inner.isLowPowerModeEnabled()
}
#[must_use]
pub fn is_ios_app_on_mac(&self) -> bool {
self.inner.isiOSAppOnMac()
}
#[must_use]
pub fn is_mac_catalyst_app(&self) -> bool {
self.inner.isMacCatalystApp()
}
pub fn is_device_certified(&self, tier: isize) -> Result<bool, Error> {
if !self.inner.respondsToSelector(sel!(isDeviceCertified:)) {
return Err(Error::unsupported(
"NSProcessInfo::isDeviceCertified is unavailable",
));
}
Ok(unsafe { msg_send![&*self.inner, isDeviceCertified: tier] })
}
pub fn has_performance_profile(&self, profile: isize) -> Result<bool, Error> {
if !self.inner.respondsToSelector(sel!(hasPerformanceProfile:)) {
return Err(Error::unsupported(
"NSProcessInfo::hasPerformanceProfile is unavailable",
));
}
Ok(unsafe { msg_send![&*self.inner, hasPerformanceProfile: profile] })
}
}