use std::ffi::OsStr;
use std::os::windows::ffi::OsStrExt;
use std::path::Path;
use windows::core::PCWSTR;
use windows::Win32::System::Environment::ExpandEnvironmentStringsW;
pub fn get_u16_vec<P: AsRef<Path>>(path: P) -> Vec<u16> {
path.as_ref()
.as_os_str()
.encode_wide()
.chain(std::iter::once(0))
.collect()
}
pub fn expand_environment_variables(input: &str) -> Option<String> {
unsafe {
let wide_input: Vec<u16> = OsStr::new(input)
.encode_wide()
.chain(std::iter::once(0))
.collect();
let required_size = ExpandEnvironmentStringsW(PCWSTR::from_raw(wide_input.as_ptr()), None);
if required_size == 0 {
return None;
}
let mut buffer: Vec<u16> = vec![0; required_size as usize];
let result =
ExpandEnvironmentStringsW(PCWSTR::from_raw(wide_input.as_ptr()), Some(&mut buffer));
if result > 0 && result <= required_size {
if let Some(&0) = buffer.last() {
buffer.pop();
}
Some(String::from_utf16_lossy(&buffer))
} else {
None
}
}
}