#![allow(dead_code)]
use objc2::class;
use std::os::raw::c_ulong;
use std::path::PathBuf;
use crate::apple_helpers::Object;
use crate::apple_helpers::__msg_send_parse;
use crate::apple_helpers::{msg_send, ns_string_to_string};
pub const NS_LIBRARY_DIRECTORY: c_ulong = 5;
pub const NS_USER_DIRECTORY: c_ulong = 7;
pub const NS_DOCUMENT_DIRECTORY: c_ulong = 9;
pub const NS_CACHES_DIRECTORY: c_ulong = 13;
pub const NS_APPLICATION_SUPPORT_DIRECTORY: c_ulong = 14;
pub const NS_DOWNLOADS_DIRECTORY: c_ulong = 15;
const NS_USER_DOMAIN_MASK: c_ulong = 1;
pub fn get_macos_dir(directory: c_ulong) -> Option<String> {
unsafe {
let nsfilemanager = class!(NSFileManager);
let instance: &Object = msg_send![nsfilemanager, defaultManager];
let directories: &Object =
msg_send![instance, URLsForDirectory:directory inDomains:NS_USER_DOMAIN_MASK];
let obj: Option<&Object> = msg_send![directories, firstObject];
if let Some(obj) = obj {
let str: Option<&Object> = msg_send![obj, path];
match str {
Some(v) => Some(String::from(ns_string_to_string(v))),
None => None,
}
} else {
None
}
}
}
pub fn get_macos_dir_fail_if_sandbox(directory: c_ulong) -> Option<PathBuf> {
if let Some(dir) = get_macos_dir(directory) {
if dir.contains("Library/Containers/") {
None
} else {
Some(PathBuf::from(dir))
}
} else {
None
}
}