use std::path::PathBuf;
fn strip_special_components<P: AsRef<std::path::Path>>(input: P) -> PathBuf {
let mut result = PathBuf::new();
for component in input.as_ref().components() {
use std::path::Component::*;
match component {
CurDir => {} ParentDir => {
result.pop(); }
Normal(part) => result.push(part),
RootDir => result.push(component),
Prefix(prefix) => result.push(prefix.as_os_str()), }
}
result
}
pub fn parse_data_directory<P: AsRef<std::path::Path>>(
config_dir: &P,
mut data_dir: String,
) -> PathBuf {
if data_dir.starts_with('"') {
let mut result = String::new();
let mut i = 1;
let chars: Vec<char> = data_dir.chars().collect();
while i < chars.len() {
if chars[i] == '&' {
i += 1; } else if chars[i] == '"' {
break;
}
if i < chars.len() {
result.push(chars[i]);
}
i += 1;
}
data_dir = result;
}
if data_dir.starts_with("?userdata?") {
let suffix = data_dir["?userdata?".len()..].trim_start_matches(&['/', '\\'][..]);
data_dir = crate::default_userdata_path()
.join(suffix)
.to_string_lossy()
.to_string();
} else if data_dir.starts_with("?userconfig?") {
let suffix = data_dir["?userdata?".len()..].trim_start_matches(&['/', '\\'][..]);
data_dir = crate::default_config_path()
.join(suffix)
.to_string_lossy()
.to_string();
}
let data_dir = data_dir.replace(['/', '\\'], &std::path::MAIN_SEPARATOR.to_string());
let mut path = PathBuf::from(&data_dir);
if !path.is_absolute() {
path = config_dir.as_ref().join(path);
}
strip_special_components(path)
}