use std::fmt;
#[cfg(target_os = "macos")]
mod macos;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Permission {
Accessibility,
InputMonitoring,
}
impl Permission {
#[must_use]
pub fn name(self) -> &'static str {
match self {
Self::Accessibility => "Accessibility",
Self::InputMonitoring => "Input Monitoring",
}
}
}
impl fmt::Display for Permission {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(self.name())
}
}
#[derive(Debug, thiserror::Error)]
pub enum PermissionError {
#[error("permissions are not managed on this platform")]
Unsupported,
#[error("cannot open the {0} pane in System Settings")]
OpenSettings(Permission),
}
#[must_use]
pub fn missing() -> Vec<Permission> {
#[cfg(target_os = "macos")]
return macos::missing();
#[cfg(not(target_os = "macos"))]
Vec::new()
}
pub fn request(permission: Permission) -> Result<(), PermissionError> {
#[cfg(target_os = "macos")]
return macos::request(permission);
#[cfg(not(target_os = "macos"))]
{
let _ = permission;
Err(PermissionError::Unsupported)
}
}