Tunnel tui functions are now implemented on Tunnel

This commit is contained in:
Dreaded_X 2025-04-16 02:14:57 +02:00
parent 3ada40d4ae
commit 693df6817a
Signed by: Dreaded_X
GPG Key ID: FA5F485356B0D2D4
2 changed files with 39 additions and 37 deletions

View File

@ -12,7 +12,7 @@ use ratatui::{
}; };
use unicode_width::UnicodeWidthStr; use unicode_width::UnicodeWidthStr;
use crate::tunnel::{self, Tunnel}; use crate::tunnel::Tunnel;
#[derive(Default)] #[derive(Default)]
pub struct Renderer { pub struct Renderer {
@ -28,7 +28,7 @@ impl Renderer {
// NOTE: This needs to be a separate function as the render functions can not be async // NOTE: This needs to be a separate function as the render functions can not be async
pub async fn update(&mut self, tunnels: &[Tunnel], index: Option<usize>) { pub async fn update(&mut self, tunnels: &[Tunnel], index: Option<usize>) {
self.table_rows = futures::stream::iter(tunnels) self.table_rows = futures::stream::iter(tunnels)
.then(tunnel::tui::to_row) .then(Tunnel::to_row)
.collect::<Vec<_>>() .collect::<Vec<_>>()
.await; .await;
@ -144,7 +144,7 @@ impl Renderer {
} }
fn compute_widths(&mut self) -> Vec<Constraint> { fn compute_widths(&mut self) -> Vec<Constraint> {
let table_header = tunnel::tui::header(); let table_header = Tunnel::header();
std::iter::once(&table_header) std::iter::once(&table_header)
.chain(&self.table_rows) .chain(&self.table_rows)
.map(|row| row.iter().map(|cell| cell.width() as u16)) .map(|row| row.iter().map(|cell| cell.width() as u16))
@ -173,7 +173,7 @@ impl Renderer {
.height(1) .height(1)
}); });
let header = tunnel::tui::header() let header = Tunnel::header()
.iter() .iter()
.cloned() .cloned()
.map(Cell::from) .map(Cell::from)

View File

@ -5,37 +5,39 @@ use ratatui::text::Span;
use super::{Tunnel, TunnelAccess}; use super::{Tunnel, TunnelAccess};
pub fn header() -> Vec<Span<'static>> { impl Tunnel {
vec![ pub fn header() -> Vec<Span<'static>> {
"Name".into(), vec![
"Access".into(), "Name".into(),
"Port".into(), "Access".into(),
"Address".into(), "Port".into(),
"Conn".into(), "Address".into(),
"Rx".into(), "Conn".into(),
"Tx".into(), "Rx".into(),
] "Tx".into(),
} ]
}
pub async fn to_row(tunnel: &Tunnel) -> Vec<Span<'static>> {
let access = match tunnel.inner.access.read().await.deref() { pub async fn to_row(tunnel: &Tunnel) -> Vec<Span<'static>> {
TunnelAccess::Private(owner) => owner.clone().yellow(), let access = match tunnel.inner.access.read().await.deref() {
TunnelAccess::Protected => "PROTECTED".blue(), TunnelAccess::Private(owner) => owner.clone().yellow(),
TunnelAccess::Public => "PUBLIC".green(), TunnelAccess::Protected => "PROTECTED".blue(),
}; TunnelAccess::Public => "PUBLIC".green(),
};
let address = tunnel
.get_address() let address = tunnel
.map(|address| format!("http://{address}").into()) .get_address()
.unwrap_or("FAILED".red()); .map(|address| format!("http://{address}").into())
.unwrap_or("FAILED".red());
vec![
tunnel.registry_entry.get_name().to_owned().into(), vec![
access, tunnel.registry_entry.get_name().to_owned().into(),
tunnel.inner.port.to_string().into(), access,
address, tunnel.inner.port.to_string().into(),
tunnel.inner.stats.connections().to_string().into(), address,
tunnel.inner.stats.rx().to_string().into(), tunnel.inner.stats.connections().to_string().into(),
tunnel.inner.stats.tx().to_string().into(), tunnel.inner.stats.rx().to_string().into(),
] tunnel.inner.stats.tx().to_string().into(),
]
}
} }