blob: 82f8a35e50db666a2d414320e169fcf7e2853382 [file]
use crate::ffi::{OsStr, OsString};
use crate::os::motor::ffi::OsStrExt;
use crate::path::{self, PathBuf};
use crate::sys::pal::map_motor_error;
use crate::{fmt, io, iter, str};
const PATH_SEPARATOR: char = ':';
pub type SplitPaths<'a> = iter::Map<str::Split<'a, char>, fn(&str) -> PathBuf>;
pub fn split_paths(unparsed: &OsStr) -> SplitPaths<'_> {
fn into_pathbuf(part: &str) -> PathBuf {
PathBuf::from(part)
}
unparsed.as_str().split(PATH_SEPARATOR).map(into_pathbuf as fn(&str) -> PathBuf)
}
#[derive(Debug)]
pub struct JoinPathsError;
pub fn join_paths<I, T>(paths: I) -> Result<OsString, JoinPathsError>
where
I: Iterator<Item = T>,
T: AsRef<OsStr>,
{
let mut joined = String::new();
for (i, path) in paths.enumerate() {
let path = path.as_ref().as_str();
if i > 0 {
joined.push(PATH_SEPARATOR);
}
if path.contains(PATH_SEPARATOR) {
return Err(JoinPathsError);
}
joined.push_str(path);
}
Ok(OsString::from(joined))
}
impl fmt::Display for JoinPathsError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "path segment contains separator `{PATH_SEPARATOR}`")
}
}
impl crate::error::Error for JoinPathsError {}
pub fn getcwd() -> io::Result<PathBuf> {
moto_rt::fs::getcwd().map(PathBuf::from).map_err(map_motor_error)
}
pub fn chdir(path: &path::Path) -> io::Result<()> {
moto_rt::fs::chdir(path.as_os_str().as_str()).map_err(map_motor_error)
}
pub fn home_dir() -> Option<PathBuf> {
Some(PathBuf::from("/user"))
}
pub fn current_exe() -> io::Result<PathBuf> {
moto_rt::process::current_exe().map(PathBuf::from).map_err(map_motor_error)
}
pub fn temp_dir() -> PathBuf {
crate::env::var_os("TMPDIR").map(PathBuf::from).unwrap_or_else(|| PathBuf::from("/user/tmp"))
}