use std::fmt;
use crate::maths::Bool32T;
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
#[repr(u32)]
pub enum PermissionType {
Microphone = 0,
Camera = 1,
EyeInput = 2,
HandTracking = 3,
FaceTracking = 4,
Scene = 5,
Max = 6,
}
impl fmt::Display for PermissionType {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
PermissionType::Microphone => write!(f, "Microphone"),
PermissionType::Camera => write!(f, "Camera"),
PermissionType::EyeInput => write!(f, "Eye Input"),
PermissionType::HandTracking => write!(f, "Hand Tracking"),
PermissionType::FaceTracking => write!(f, "Face Tracking"),
PermissionType::Scene => write!(f, "Scene"),
PermissionType::Max => write!(f, "Max"),
}
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
#[repr(i32)]
pub enum PermissionState {
Unavailable = -2,
Capable = -1,
Unknown = 0,
Granted = 1,
}
impl fmt::Display for PermissionState {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
PermissionState::Unavailable => write!(f, "Unavailable"),
PermissionState::Capable => write!(f, "Capable"),
PermissionState::Unknown => write!(f, "Unknown"),
PermissionState::Granted => write!(f, "Granted"),
}
}
}
unsafe extern "C" {
pub fn permission_state(permission: PermissionType) -> PermissionState;
pub fn permission_is_interactive(permission: PermissionType) -> Bool32T;
pub fn permission_request(permission: PermissionType);
}
pub struct Permission;
impl Permission {
pub fn get_state(permission: PermissionType) -> PermissionState {
unsafe { permission_state(permission) }
}
pub fn is_interactive(permission: PermissionType) -> bool {
unsafe { permission_is_interactive(permission) != 0 }
}
pub fn request(permission: PermissionType) {
unsafe { permission_request(permission) }
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_permission_state() {
for i in 0..(PermissionType::Max as u32) {
let permission = unsafe { std::mem::transmute::<u32, PermissionType>(i) };
let _state = Permission::get_state(permission);
let _interactive = Permission::is_interactive(permission);
}
}
#[test]
fn test_permission_display() {
assert_eq!(format!("{}", PermissionType::Microphone), "Microphone");
assert_eq!(format!("{}", PermissionType::Camera), "Camera");
assert_eq!(format!("{}", PermissionState::Granted), "Granted");
assert_eq!(format!("{}", PermissionState::Capable), "Capable");
}
#[test]
fn test_permission_enum_values() {
assert_eq!(PermissionType::Microphone as u32, 0);
assert_eq!(PermissionType::Camera as u32, 1);
assert_eq!(PermissionType::EyeInput as u32, 2);
assert_eq!(PermissionType::HandTracking as u32, 3);
assert_eq!(PermissionType::FaceTracking as u32, 4);
assert_eq!(PermissionType::Scene as u32, 5);
}
}