dotune 0.3.0

A cross-platform dotfile manager configured with Lua
use core::fmt;
use core::fmt::Display;
use std::path::{MAIN_SEPARATOR, Path};

use super::system_info::{CURRENT_DIR, HOME_DIR};

pub trait RelativeDisplay {
    fn relative_display(&self) -> impl fmt::Display;
}

impl RelativeDisplay for Path {
    fn relative_display(&self) -> impl fmt::Display {
        let path = dunce::simplified(self);
        let cwd = dunce::simplified(CURRENT_DIR.as_ref());
        let home = dunce::simplified(HOME_DIR.as_ref());

        fmt::from_fn(move |formatter| {
            if let Ok(relative) = path.strip_prefix(cwd) {
                return relative.display().fmt(formatter);
            }

            if let Ok(relative) = path.strip_prefix(home) {
                formatter.write_str("~")?;
                if relative.is_empty() {
                    return Ok(());
                }
                return write!(formatter, "{}{}", MAIN_SEPARATOR, relative.display());
            }

            path.display().fmt(formatter)
        })
    }
}