From 1b26997d25f748e0d452f41fe41791533046ecdf Mon Sep 17 00:00:00 2001 From: Jack Wills <32690432+mrjackwills@users.noreply.github.com> Date: Tue, 3 Dec 2024 20:39:51 +0000 Subject: [PATCH] feat: ContainerPorts use ipaddr --- src/app_data/container_state.rs | 15 +++++++++------ src/app_data/mod.rs | 21 +++++++++------------ src/docker_data/mod.rs | 2 +- src/ui/draw_blocks.rs | 16 ++++++++++------ 4 files changed, 29 insertions(+), 25 deletions(-) diff --git a/src/app_data/container_state.rs b/src/app_data/container_state.rs index 6cc73f7..d48e279 100644 --- a/src/app_data/container_state.rs +++ b/src/app_data/container_state.rs @@ -2,6 +2,7 @@ use std::{ cmp::Ordering, collections::{HashSet, VecDeque}, fmt, + net::IpAddr, }; use bollard::service::Port; @@ -103,9 +104,9 @@ macro_rules! unit_struct { unit_struct!(ContainerName); unit_struct!(ContainerImage); -#[derive(Debug, Clone, PartialEq, Eq)] +#[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct ContainerPorts { - pub ip: Option, + pub ip: Option, pub private: u16, pub public: Option, } @@ -113,7 +114,7 @@ pub struct ContainerPorts { impl From for ContainerPorts { fn from(value: Port) -> Self { Self { - ip: value.ip, + ip: value.ip.and_then(|i| i.parse::().ok()), private: value.private_port, public: value.public_port, } @@ -122,7 +123,9 @@ impl From for ContainerPorts { impl ContainerPorts { pub fn len_ip(&self) -> usize { - self.ip.as_ref().unwrap_or(&String::new()).chars().count() + self.ip + .as_ref() + .map_or(0, |i|i.to_string().chars().count()) } pub fn len_private(&self) -> usize { format!("{}", self.private).chars().count() @@ -134,11 +137,11 @@ impl ContainerPorts { } /// Return as tuple of Strings, ip address, private port, and public port - pub fn print(&self) -> (String, String, String) { + pub fn get_all(&self) -> (String, String, String) { ( self.ip .as_ref() - .map_or(String::new(), std::borrow::ToOwned::to_owned), + .map_or(String::new(), std::string::ToString::to_string), format!("{}", self.private), self.public.map_or(String::new(), |s| s.to_string()), ) diff --git a/src/app_data/mod.rs b/src/app_data/mod.rs index 8cbaf01..ae7dabb 100644 --- a/src/app_data/mod.rs +++ b/src/app_data/mod.rs @@ -450,39 +450,36 @@ impl AppData { } /// Find the longest port when it's transformed into a string, defaults are header lens (ip, private, public) - /// TODO refactor this, and write comments as to whete the initial sizes come from + ///display like this: "│ ip, private, public│", so (5,10,9) are the minimum lengths required pub fn get_longest_port(&self) -> (usize, usize, usize) { - let mut longest_ip = 5; - let mut longest_private = 10; - let mut longest_public = 9; + let mut output = (5, 10, 9); for item in [&self.containers.items, &self.hidden_containers] { for item in item { - longest_ip = longest_ip.max( + output.0 = output.0.max( item.ports .iter() .map(ContainerPorts::len_ip) .max() - .unwrap_or(3), + .unwrap_or(output.0), ); - longest_private = longest_private.max( + output.1 = output.1.max( item.ports .iter() .map(ContainerPorts::len_private) .max() - .unwrap_or(8), + .unwrap_or(output.1), ); - longest_public = longest_public.max( + output.2 = output.2.max( item.ports .iter() .map(ContainerPorts::len_public) .max() - .unwrap_or(6), + .unwrap_or(output.2), ); } } - - (longest_ip, longest_private, longest_public) + output } /// Get Option of the current selected container's ports, sorted by private port diff --git a/src/docker_data/mod.rs b/src/docker_data/mod.rs index 4841e7d..03c6e51 100644 --- a/src/docker_data/mod.rs +++ b/src/docker_data/mod.rs @@ -292,7 +292,7 @@ impl DockerData { GuiState::start_loading_animation(&self.gui_state, loading_uuid); self.update_all_containers().await; let all_ids = self.app_data.lock().get_all_id_state(); - let all_ids_len = all_ids.len(); + let all_ids_len = all_ids.len(); let init = self.init_all_logs(all_ids); self.update_all_container_stats(); diff --git a/src/ui/draw_blocks.rs b/src/ui/draw_blocks.rs index 0f2f840..b78a06c 100644 --- a/src/ui/draw_blocks.rs +++ b/src/ui/draw_blocks.rs @@ -330,7 +330,7 @@ pub fn ports( )]; for item in ports.0 { let fg = Color::White; - let strings = item.print(); + let strings = item.get_all(); let line = vec![ Span::from(format!("{:>ip$}", strings.0)).fg(fg), @@ -1066,7 +1066,11 @@ fn popup(text_lines: usize, text_width: usize, r: Rect, box_location: BoxLocatio #[allow(clippy::unwrap_used)] mod tests { - use std::{ops::RangeInclusive, sync::Arc}; + use std::{ + net::{IpAddr, Ipv4Addr}, + ops::RangeInclusive, + sync::Arc, + }; use parking_lot::Mutex; use ratatui::{ @@ -3171,7 +3175,7 @@ mod tests { setup.app_data.lock().containers.items[0] .ports .push(ContainerPorts { - ip: Some("127.0.0.1".to_owned()), + ip: Some(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1))), private: 8003, public: Some(8003), }); @@ -3317,7 +3321,7 @@ mod tests { setup.app_data.lock().containers.items[0] .ports .push(ContainerPorts { - ip: Some("127.0.0.1".to_owned()), + ip: Some(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1))), private: 8003, public: Some(8003), }); @@ -3381,7 +3385,7 @@ mod tests { setup.app_data.lock().containers.items[1] .ports .push(ContainerPorts { - ip: Some("127.0.0.1".to_owned()), + ip: Some(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1))), private: 8003, public: Some(8003), }); @@ -3498,7 +3502,7 @@ mod tests { setup.app_data.lock().containers.items[0] .ports .push(ContainerPorts { - ip: Some("127.0.0.1".to_owned()), + ip: Some(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1))), private: 8003, public: Some(8003), });