From bc0d7dc0f77f3ec2f4f105dd44027d0c006328ea Mon Sep 17 00:00:00 2001 From: PaysanCorrezien <108607151+PaysanCorrezien@users.noreply.github.com> Date: Wed, 7 Feb 2024 15:02:50 +0100 Subject: [PATCH] add support for windows UNC path --- src/util.rs | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/util.rs b/src/util.rs index 1f8fc95..7de1426 100644 --- a/src/util.rs +++ b/src/util.rs @@ -268,6 +268,7 @@ pub fn path_to_str(path: &impl AsRef) -> Result<&str> { pub fn resolve_path(path: impl AsRef) -> Result { let path = path.as_ref(); let base_path; + let unc_path; let mut components = path.components().peekable(); let mut stack = Vec::new(); @@ -309,6 +310,9 @@ pub fn resolve_path(path: impl AsRef) -> Result { Ok(path) } + fn get_network_path(server: &OsStr, share: &OsStr) -> PathBuf { + format!(r"\\{}\{}", server.to_string_lossy(), share.to_string_lossy()).into() + } match components.peek() { Some(Component::Prefix(prefix)) => match prefix.kind() { Prefix::Disk(drive_letter) => { @@ -331,6 +335,28 @@ pub fn resolve_path(path: impl AsRef) -> Result { base_path = get_drive_path(drive_letter); stack.extend(base_path.components()); } + Prefix::VerbatimUNC(server, share) => { + unc_path = get_network_path(server, share); + + components.next(); // Consume the Prefix component + + if components.peek() == Some(&Component::RootDir) { + components.next(); + } + + stack.extend(unc_path.components()); + } + Prefix::UNC(server, share) => { + unc_path = get_network_path(server, share); + + components.next(); // Consume the Prefix component + + if components.peek() == Some(&Component::RootDir) { + components.next(); + } + + stack.extend(unc_path.components()); + } _ => bail!("invalid path: {}", path.display()), }, Some(Component::RootDir) => {