use std::{
borrow::Cow,
ffi::{OsStr, OsString},
};
pub const AND_SD: &str = "/storage/self/primary";
pub type OsCow<'a> = Option<Cow<'a, OsStr>>;
pub fn from_str(s: &str) -> OsCow {
Some(Cow::from(OsStr::new(s)))
}
pub fn into_os_cow<'a, I: Into<OsString>>(s: I) -> OsCow<'a> {
Some(Cow::from(s.into())) }
#[cfg(target_os = "android")]
pub(crate) fn set_android_dir(s: &str) -> OsCow {
into_os_cow(std::path::Path::new(AND_SD).join(s))
}
#[cfg(test)]
mod tests {
#[test]
fn into_os_cow_doc() {
use std::{
borrow::Cow,
path::{Path, PathBuf},
};
let path = Path::new("/usr/bin");
let os_cow = crate::os_cow::into_os_cow(path);
let path_cow = Cow::from(path.as_os_str());
assert_eq!(os_cow, Some(path_cow));
let pathbuf = PathBuf::from("/usr/bin");
let cow_os_string = Cow::from(pathbuf.into_os_string());
assert_eq!(os_cow, Some(cow_os_string));
}
#[test]
fn os_cow_doc() {
use std::{borrow::Cow, ffi::OsStr};
let str = "/usr/bin";
let os_cow = crate::os_cow::from_str(str);
assert_eq!(os_cow, Some(Cow::from(OsStr::new(str))));
}
#[cfg(target_os = "android")]
#[test]
fn set_android_dir_doc() {
use std::ffi::OsStr;
let android_dir = os_cow::set_android_dir("Android/obb/com.x.y/");
assert_eq!(
android_dir,
Some(std::borrow::Cow::from(OsStr::new(
"/storage/self/primary/Android/obb/com.x.y/"
)))
);
}
}