Skip to main content

planus_translation/util/
mod.rs

1use std::path::{Component, Path, PathBuf};
2
3pub mod sorted_map;
4
5pub fn normalize_path(path: &Path) -> PathBuf {
6    let mut components = path.components().peekable();
7    let mut ret = if let Some(c @ Component::Prefix(..)) = components.peek().cloned() {
8        components.next();
9        PathBuf::from(c.as_os_str())
10    } else {
11        PathBuf::new()
12    };
13
14    for component in components {
15        match component {
16            Component::Prefix(..) => unreachable!(),
17            Component::RootDir => {
18                ret.push(component.as_os_str());
19            }
20            Component::CurDir => {}
21            Component::ParentDir => {
22                if let Some(Component::Normal(_)) = ret.components().next_back() {
23                    ret.pop();
24                } else {
25                    ret.push(Component::ParentDir);
26                }
27            }
28            Component::Normal(c) => {
29                ret.push(c);
30            }
31        }
32    }
33    ret
34}