soft-canonicalize 0.5.5

Path canonicalization that works with non-existing paths.
Documentation
use soft_canonicalize::soft_canonicalize;
use std::path::Path;

fn main() {
    println!("Testing empty path behavior:");

    println!(
        "std::fs::canonicalize(\"\"): {:?}",
        std::fs::canonicalize("")
    );
    println!(
        "soft_canonicalize(\"\"): {:?}",
        soft_canonicalize(Path::new(""))
    );

    let empty_path = Path::new("");
    println!("\nPath::new(\"\") details:");
    println!("  is_absolute(): {}", empty_path.is_absolute());
    println!("  as_os_str(): {:?}", empty_path.as_os_str());
    println!("  components count: {}", empty_path.components().count());

    if let Ok(cwd) = std::env::current_dir() {
        println!("\nCurrent directory handling:");
        println!("Current directory: {cwd:?}");
        let joined = cwd.join(empty_path);
        println!("current_dir().join(Path::new(\"\")): {joined:?}");
        println!(
            "std::fs::canonicalize of joined: {:?}",
            std::fs::canonicalize(&joined)
        );
        println!(
            "soft_canonicalize of joined: {:?}",
            soft_canonicalize(&joined)
        );
    }

    println!("\nComparison with current directory:");
    if let Ok(_cwd) = std::env::current_dir() {
        println!(
            "soft_canonicalize(\".\"): {:?}",
            soft_canonicalize(Path::new("."))
        );
        println!(
            "std::fs::canonicalize(\".\"): {:?}",
            std::fs::canonicalize(".")
        );
    }
}