2024-04-23 20:52:30 -04:00
|
|
|
use std::{
|
|
|
|
fmt::{self, Display, Formatter},
|
|
|
|
fs,
|
|
|
|
};
|
|
|
|
|
|
|
|
pub struct TerminalFileLink<'a>(pub &'a str);
|
|
|
|
|
|
|
|
impl<'a> Display for TerminalFileLink<'a> {
|
|
|
|
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
|
2024-05-12 22:11:11 -04:00
|
|
|
let path = fs::canonicalize(self.0);
|
|
|
|
|
|
|
|
if let Some(path) = path.as_deref().ok().and_then(|path| path.to_str()) {
|
|
|
|
// Windows itself can't handle its verbatim paths.
|
|
|
|
#[cfg(windows)]
|
|
|
|
let path = if path.len() > 5 && &path[0..4] == r"\\?\" {
|
|
|
|
&path[4..]
|
|
|
|
} else {
|
|
|
|
path
|
|
|
|
};
|
|
|
|
|
|
|
|
write!(f, "\x1b]8;;file://{path}\x1b\\{}\x1b]8;;\x1b\\", self.0)
|
2024-04-23 20:52:30 -04:00
|
|
|
} else {
|
|
|
|
write!(f, "{}", self.0)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|