pub mod components;
use crate::components::*;
pub fn is_name_reserved(name: &String, strict_check: bool) -> bool {
let reserved_names = if strict_check {
NOT_ALLOWED_NAMES.to_vec()
} else {
NOT_ALLOWED_NAMES_WIN11.to_vec()
};
let name = name.to_uppercase();
let name_vec = name.chars().collect::<Vec<_>>();
if reserved_names.iter().any(|e| e == &name) {
return true;
}
if !strict_check {
return false;
}
if name.len() >= 3 && reserved_names.iter().any(|e| e == &name_vec[..3].into_iter().collect::<String>()) {
return &name_vec[3] == &'.';
}
if name.len() >= 4 && reserved_names.iter().any(|e| e == &name_vec[..4].into_iter().collect::<String>()) {
return &name_vec[4] == &'.';
}
false
}
pub fn is_safe_name(name: &String, only_check_creatable: bool, strict_check: bool) -> bool {
for not_allowed_char in NOT_ALLOWED_CHARS {
for char_in_name in name.chars() {
if not_allowed_char == char_in_name {
return false;
}
}
}
if is_name_reserved(name, strict_check) {
return false;
}
if only_check_creatable {
return true;
}
if name.chars().next_back().unwrap_or('.') == '.' {
return false;
}
if name.chars().next_back().unwrap_or(' ') == ' ' {
return false;
}
if strict_check && name.chars().next().unwrap_or(' ') == ' ' {
return false;
}
true
}
pub fn to_safe_name(
name: &String,
replace_method_table: ReplaceMethodTableConstructor,
dot_handling_policy: DotHandlingPolicy
) -> String {
let table = replace_method_table.table;
let replace_method = &replace_method_table.replace_method;
let mut name_chars: Vec<char> = name.chars().map(|chr| {
if let Some(replaced) = table.get(&chr) {
*replaced
} else {
chr
}
}).filter(|chr| *chr != '\0').collect();
let length = name_chars.len();
for i in 0..length {
if name_chars[i] != ' ' {
name_chars = name_chars[i..].to_vec();
break;
}
}
let length = name_chars.len();
for i in (0..length).rev() {
if name_chars[i] != ' ' {
name_chars = name_chars[..=i].to_vec();
break;
}
}
let replace = |replace_char: &ReplaceChar, name_chars: &mut Vec<char>| {
let chr = replace_char.get_char();
if let Some(_) = table.get(&chr) {
remove(name_chars);
} else {
let last_element = name_chars.last_mut().unwrap();
*last_element = chr;
}
};
fn remove(name_chars: &mut Vec<char>) {
while let Some(last_char) = name_chars.last() {
if *last_char == '.' {
name_chars.pop();
} else {
break;
}
}
}
if name_chars.last() == Some(&'.') {
match dot_handling_policy {
DotHandlingPolicy::NotCorrect => {},
DotHandlingPolicy::Replace(replace_char) => match replace_char {
ReplaceChar::Space => panic!("Cannot replace to space. Use DotHandlingPolicy::Remove instead."),
_ => replace(&replace_char, &mut name_chars),
}
DotHandlingPolicy::Remove => remove(&mut name_chars),
DotHandlingPolicy::ReplaceWithReplaceMethod => match replace_method {
ReplaceMethod::Fullwidth(_) => replace(&ReplaceChar::Charactor('.'), &mut name_chars),
ReplaceMethod::Replace(replace_char) => match replace_char {
ReplaceChar::Space => remove(&mut name_chars),
_ => replace(replace_char, &mut name_chars),
},
ReplaceMethod::Remove => remove(&mut name_chars),
}
}
}
let mut replace_char = match replace_method {
ReplaceMethod::Fullwidth(replace_char) => replace_char.get_char(),
ReplaceMethod::Remove => '_',
ReplaceMethod::Replace(replace_char) => replace_char.get_char(),
};
if replace_char == '.' {
replace_char = '_';
}
if is_name_reserved(&name_chars.clone().into_iter().collect::<String>(), true) {
name_chars.insert(0, replace_char);
}
if name_chars.len() == 0 {
name_chars.push(replace_char);
}
name_chars.clone().into_iter().collect::<String>()
}
pub fn simply_to_safe_name(name: &str, fullwidth: bool) -> String {
if fullwidth {
to_safe_name(
&name.to_string(),
ReplaceMethod::Fullwidth(ReplaceChar::Underscore).compile(),
DotHandlingPolicy::ReplaceWithReplaceMethod,
)
} else {
to_safe_name(
&name.to_string(),
ReplaceMethod::Replace(ReplaceChar::Underscore).compile(),
DotHandlingPolicy::ReplaceWithReplaceMethod,
)
}
}