patholog 1.0.0

Diagnose, explain, clean, and safely repair PATH behavior.
Documentation
use std::path::Path;

use crate::model::{PathEntry, PlatformMode};
use crate::normalize::comparison_key;
use crate::platform::resolve_platform_rules;

pub(crate) fn parse_path(
    path_value: &str,
    platform_mode: PlatformMode,
    pathext: Option<&str>,
) -> Vec<PathEntry> {
    let rules = resolve_platform_rules(platform_mode, pathext);

    path_value
        .split(rules.separator)
        .enumerate()
        .map(|(zero_based_index, raw_entry)| {
            let index = zero_based_index + 1;
            if raw_entry.is_empty() {
                return PathEntry {
                    index,
                    raw: String::new(),
                    display: String::new(),
                    comparison_key: String::new(),
                    exists: false,
                    is_dir: false,
                    is_empty: true,
                };
            }

            let path = Path::new(raw_entry);
            let exists = path.exists();
            PathEntry {
                index,
                raw: raw_entry.to_owned(),
                display: raw_entry.to_owned(),
                comparison_key: comparison_key(raw_entry, &rules),
                exists,
                is_dir: exists && path.is_dir(),
                is_empty: false,
            }
        })
        .collect()
}

#[cfg(test)]
#[path = "path_env/tests.rs"]
mod tests;