summaryrefslogtreecommitdiff
path: root/src/terminal_link.rs
diff options
context:
space:
mode:
authormo8it <mo8it@proton.me>2024-07-05 13:39:50 +0200
committermo8it <mo8it@proton.me>2024-07-05 13:39:50 +0200
commit7123c7ae3a9605fbe962e4ef0a0f1424cd16fef8 (patch)
treec67f7e62bb9a179ae4fdbab492501cb6847e64c7 /src/terminal_link.rs
parent77b687d501771c24bd83294d97b8e6f9ffa92d6b (diff)
parent4d9c346a173bb722b929f3ea3c00f84954483e24 (diff)
Merge remote-tracking branch 'upstream/main' into fix-enum-variant-inconsistency
Diffstat (limited to 'src/terminal_link.rs')
-rw-r--r--src/terminal_link.rs26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/terminal_link.rs b/src/terminal_link.rs
new file mode 100644
index 0000000..9bea07d
--- /dev/null
+++ b/src/terminal_link.rs
@@ -0,0 +1,26 @@
+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 {
+ 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)
+ } else {
+ write!(f, "{}", self.0)
+ }
+ }
+}