Added the ability to close a tunnel from the tui
This commit is contained in:
parent
4fa885843f
commit
15f382b654
|
@ -1,4 +1,4 @@
|
||||||
use std::{io::Write, iter::once};
|
use std::{cmp::min, io::Write, iter::once};
|
||||||
|
|
||||||
use clap::Parser as _;
|
use clap::Parser as _;
|
||||||
use ratatui::{Terminal, TerminalOptions, Viewport, layout::Rect, prelude::CrosstermBackend};
|
use ratatui::{Terminal, TerminalOptions, Viewport, layout::Rect, prelude::CrosstermBackend};
|
||||||
|
@ -116,6 +116,25 @@ impl Handler {
|
||||||
warn!("User not set");
|
warn!("User not set");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Input::Delete => {
|
||||||
|
let Some(selected) = self.selected else {
|
||||||
|
return Ok(false);
|
||||||
|
};
|
||||||
|
|
||||||
|
if selected >= self.tunnels.len() {
|
||||||
|
warn!("Trying to delete tunnel out of bounds");
|
||||||
|
return Ok(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
let tunnel = self.tunnels.remove(selected);
|
||||||
|
self.all_tunnels.remove_tunnel(tunnel).await;
|
||||||
|
|
||||||
|
if self.tunnels.is_empty() {
|
||||||
|
self.selected = None;
|
||||||
|
} else {
|
||||||
|
self.selected = Some(min(self.tunnels.len() - 1, selected));
|
||||||
|
}
|
||||||
|
}
|
||||||
Input::CtrlP => {
|
Input::CtrlP => {
|
||||||
self.set_access_selection(TunnelAccess::Protected).await;
|
self.set_access_selection(TunnelAccess::Protected).await;
|
||||||
}
|
}
|
||||||
|
@ -321,7 +340,9 @@ impl Drop for Handler {
|
||||||
let mut all_tunnels = self.all_tunnels.clone();
|
let mut all_tunnels = self.all_tunnels.clone();
|
||||||
|
|
||||||
tokio::spawn(async move {
|
tokio::spawn(async move {
|
||||||
all_tunnels.remove_tunnels(&tunnels).await;
|
for tunnel in tunnels {
|
||||||
|
all_tunnels.remove_tunnel(tunnel).await;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ pub enum Input {
|
||||||
Char(char),
|
Char(char),
|
||||||
Up,
|
Up,
|
||||||
Down,
|
Down,
|
||||||
|
Delete,
|
||||||
Esc,
|
Esc,
|
||||||
Enter,
|
Enter,
|
||||||
CtrlP,
|
CtrlP,
|
||||||
|
@ -18,6 +19,7 @@ impl From<&[u8]> for Input {
|
||||||
[27] => Input::Esc,
|
[27] => Input::Esc,
|
||||||
[27, 91, 65] => Input::Up,
|
[27, 91, 65] => Input::Up,
|
||||||
[27, 91, 66] => Input::Down,
|
[27, 91, 66] => Input::Down,
|
||||||
|
[27, 91, 51, 126] => Input::Delete,
|
||||||
[13] => Input::Enter,
|
[13] => Input::Enter,
|
||||||
// NOTE: Actual char is DLE, this happens to map to ctrl-p
|
// NOTE: Actual char is DLE, this happens to map to ctrl-p
|
||||||
[16] => Input::CtrlP,
|
[16] => Input::CtrlP,
|
||||||
|
|
|
@ -42,6 +42,7 @@ impl Renderer {
|
||||||
command("esc", "deselect"),
|
command("esc", "deselect"),
|
||||||
command("↓/j", "move down"),
|
command("↓/j", "move down"),
|
||||||
command("↑/k", "move up"),
|
command("↑/k", "move up"),
|
||||||
|
command("del", "close tunnel"),
|
||||||
vec![],
|
vec![],
|
||||||
command("p", "make private"),
|
command("p", "make private"),
|
||||||
command("ctrl-p", "make protected"),
|
command("ctrl-p", "make protected"),
|
||||||
|
|
|
@ -130,13 +130,11 @@ impl Tunnels {
|
||||||
tunnel
|
tunnel
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn remove_tunnels(&mut self, tunnels: &[Tunnel]) {
|
pub async fn remove_tunnel(&mut self, tunnel: Tunnel) {
|
||||||
let mut all_tunnels = self.tunnels.write().await;
|
let mut all_tunnels = self.tunnels.write().await;
|
||||||
for tunnel in tunnels {
|
if let Some(address) = tunnel.get_address() {
|
||||||
if let Some(address) = tunnel.get_address() {
|
trace!(tunnel.name, "Removing tunnel");
|
||||||
trace!(tunnel.name, "Removing tunnel");
|
all_tunnels.remove(&address);
|
||||||
all_tunnels.remove(&address);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user