use std::borrow::Cow;
use std::ffi::OsStr;
use std::path::Path;
pub fn precompose(s: Cow<'_, str>) -> Cow<'_, str> {
use unicode_normalization::UnicodeNormalization;
if s.as_ref().nfc().cmp(s.as_ref().chars()).is_eq() {
s
} else {
Cow::Owned(s.as_ref().nfc().collect())
}
}
pub fn decompose(s: Cow<'_, str>) -> Cow<'_, str> {
use unicode_normalization::UnicodeNormalization;
if s.as_ref().nfd().cmp(s.as_ref().chars()).is_eq() {
s
} else {
Cow::Owned(s.as_ref().nfd().collect())
}
}
pub fn precompose_path(path: Cow<'_, Path>) -> Cow<'_, Path> {
match path.to_str() {
None => path,
Some(maybe_decomposed) => match precompose(maybe_decomposed.into()) {
Cow::Borrowed(_) => path,
Cow::Owned(precomposed) => Cow::Owned(precomposed.into()),
},
}
}
pub fn precompose_os_string(path: Cow<'_, OsStr>) -> Cow<'_, OsStr> {
match path.to_str() {
None => path,
Some(maybe_decomposed) => match precompose(maybe_decomposed.into()) {
Cow::Borrowed(_) => path,
Cow::Owned(precomposed) => Cow::Owned(precomposed.into()),
},
}
}