wip: sort_by
This commit is contained in:
@@ -81,6 +81,7 @@ impl<T> StatefulList<T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// States of the container
|
/// States of the container
|
||||||
|
// / impl ord
|
||||||
#[derive(Clone, Debug, PartialEq, PartialOrd)]
|
#[derive(Clone, Debug, PartialEq, PartialOrd)]
|
||||||
pub enum State {
|
pub enum State {
|
||||||
Dead,
|
Dead,
|
||||||
@@ -92,6 +93,17 @@ pub enum State {
|
|||||||
Unknown,
|
Unknown,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// impl Ord for State {
|
||||||
|
// fn cmp(&self, other: &Self) -> Ordering {
|
||||||
|
// match (self, other) {
|
||||||
|
// (Self::Dead)
|
||||||
|
// // (_, Foo::B) => Ordering::Less,
|
||||||
|
// // (Foo::A { val: l }, Foo::A { val: r }) => l.cmp(&r),
|
||||||
|
// // (Foo::B, _) => Ordering::Greater,
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
impl State {
|
impl State {
|
||||||
pub fn get_color(&self) -> Color {
|
pub fn get_color(&self) -> Color {
|
||||||
match self {
|
match self {
|
||||||
@@ -102,6 +114,17 @@ impl State {
|
|||||||
_ => Color::Red,
|
_ => Color::Red,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
pub fn as_text(&self) -> &'static str {
|
||||||
|
match self {
|
||||||
|
Self::Dead => "dead",
|
||||||
|
Self::Exited => "exited",
|
||||||
|
Self::Paused => "paused",
|
||||||
|
Self::Removing => "removing",
|
||||||
|
Self::Restarting => "restarting",
|
||||||
|
Self::Running => "running",
|
||||||
|
Self::Unknown => "unknown",
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<&str> for State {
|
impl From<&str> for State {
|
||||||
|
|||||||
@@ -16,8 +16,30 @@ pub struct AppData {
|
|||||||
pub containers: StatefulList<ContainerItem>,
|
pub containers: StatefulList<ContainerItem>,
|
||||||
pub init: bool,
|
pub init: bool,
|
||||||
pub show_error: bool,
|
pub show_error: bool,
|
||||||
|
// todo
|
||||||
|
sort_by: Header
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub enum SortedOrder{
|
||||||
|
Asc,
|
||||||
|
Desc
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub enum Header{
|
||||||
|
State,
|
||||||
|
Status,
|
||||||
|
Cpu,
|
||||||
|
Memory,
|
||||||
|
Id,
|
||||||
|
Name,
|
||||||
|
Image,
|
||||||
|
Rx,
|
||||||
|
Tx
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
impl AppData {
|
impl AppData {
|
||||||
/// Generate a default app_state
|
/// Generate a default app_state
|
||||||
pub fn default(args: CliArgs) -> Self {
|
pub fn default(args: CliArgs) -> Self {
|
||||||
@@ -28,6 +50,7 @@ impl AppData {
|
|||||||
init: false,
|
init: false,
|
||||||
logs_parsed: false,
|
logs_parsed: false,
|
||||||
show_error: false,
|
show_error: false,
|
||||||
|
sort_by: Header::Memory,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -118,6 +141,86 @@ impl AppData {
|
|||||||
output
|
output
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
pub fn sort_containers(&mut self, so: SortedOrder) {
|
||||||
|
|
||||||
|
// State,
|
||||||
|
// Status,
|
||||||
|
// Cpu,
|
||||||
|
// Memory,
|
||||||
|
// Id,
|
||||||
|
// Name,
|
||||||
|
// Image,
|
||||||
|
// Rx,
|
||||||
|
// Tx
|
||||||
|
match self.sort_by {
|
||||||
|
Header::State => {
|
||||||
|
match so {
|
||||||
|
SortedOrder::Asc => self.containers.items.sort_by(|a,b|a.state.as_text().cmp(b.state.as_text())),
|
||||||
|
SortedOrder::Desc => self.containers.items.sort_by(|a,b|b.state.as_text().cmp(a.state.as_text())),
|
||||||
|
}
|
||||||
|
|
||||||
|
},
|
||||||
|
Header::Status => {
|
||||||
|
match so {
|
||||||
|
SortedOrder::Asc => self.containers.items.sort_by(|a,b|a.status.cmp(&b.status)),
|
||||||
|
SortedOrder::Desc => self.containers.items.sort_by(|a,b|b.status.cmp(&a.status)),
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
Header::Status => {
|
||||||
|
match so {
|
||||||
|
SortedOrder::Asc => self.containers.items.sort_by(|a,b|a.status.cmp(&b.status)),
|
||||||
|
SortedOrder::Desc => self.containers.items.sort_by(|a,b|b.status.cmp(&a.status)),
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
Header::Cpu => {
|
||||||
|
match so {
|
||||||
|
SortedOrder::Desc =>
|
||||||
|
self.containers.items.sort_by(|a,b|a.cpu_stats.back().cmp(&b.cpu_stats.back())),
|
||||||
|
SortedOrder::Asc => self.containers.items.sort_by(|a,b|b.cpu_stats.back().cmp(&a.cpu_stats.back()))
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
Header::Memory => {
|
||||||
|
match so {
|
||||||
|
SortedOrder::Desc =>
|
||||||
|
self.containers.items.sort_by(|a,b|a.mem_stats.back().cmp(&b.mem_stats.back())),
|
||||||
|
SortedOrder::Asc => self.containers.items.sort_by(|a,b|b.mem_stats.back().cmp(&a.mem_stats.back()))
|
||||||
|
}
|
||||||
|
},
|
||||||
|
Header::Image => {
|
||||||
|
match so {
|
||||||
|
SortedOrder::Asc => self.containers.items.sort_by(|a,b|a.image.cmp(&b.image)),
|
||||||
|
SortedOrder::Desc => self.containers.items.sort_by(|a,b|b.image.cmp(&a.image)),
|
||||||
|
}
|
||||||
|
},
|
||||||
|
Header::Name => {
|
||||||
|
match so {
|
||||||
|
SortedOrder::Asc => self.containers.items.sort_by(|a,b|a.name.cmp(&b.name)),
|
||||||
|
SortedOrder::Desc => self.containers.items.sort_by(|a,b|b.name.cmp(&a.name)),
|
||||||
|
}
|
||||||
|
},
|
||||||
|
_ => ()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// match so {
|
||||||
|
// SortedOrder::Asc => self.containers.items.sort_by(|a,b|b.name.cmp(&a.name)),
|
||||||
|
// SortedOrder::Desc => self.containers.items.sort_by(|a,b|a.name.cmp(&b.name))
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
pub fn sort_by_id(&mut self, so: SortedOrder) {
|
||||||
|
match so {
|
||||||
|
SortedOrder::Asc => self.containers.items.sort_by(|a,b|b.id.cmp(&a.id)),
|
||||||
|
SortedOrder::Desc => self.containers.items.sort_by(|a,b|a.id.cmp(&b.id))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Find the index of the currently selected single log line
|
/// Find the index of the currently selected single log line
|
||||||
pub fn get_selected_log_index(&self) -> Option<usize> {
|
pub fn get_selected_log_index(&self) -> Option<usize> {
|
||||||
let mut output = None;
|
let mut output = None;
|
||||||
|
|||||||
+30
-2
@@ -1,6 +1,6 @@
|
|||||||
use bollard::{
|
use bollard::{
|
||||||
container::{ListContainersOptions, LogsOptions, StartContainerOptions, Stats, StatsOptions},
|
container::{ListContainersOptions, LogsOptions, StartContainerOptions, Stats, StatsOptions},
|
||||||
Docker,
|
Docker, models::ContainerSummary,
|
||||||
};
|
};
|
||||||
use futures_util::{future::join_all, StreamExt};
|
use futures_util::{future::join_all, StreamExt};
|
||||||
use parking_lot::Mutex;
|
use parking_lot::Mutex;
|
||||||
@@ -8,7 +8,7 @@ use std::sync::Arc;
|
|||||||
use tokio::{sync::mpsc::Receiver, task::JoinHandle};
|
use tokio::{sync::mpsc::Receiver, task::JoinHandle};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
app_data::{AppData, DockerControls},
|
app_data::{AppData, DockerControls, SortedOrder, Header},
|
||||||
app_error::AppError,
|
app_error::AppError,
|
||||||
parse_args::CliArgs,
|
parse_args::CliArgs,
|
||||||
ui::GuiState,
|
ui::GuiState,
|
||||||
@@ -123,6 +123,26 @@ impl DockerData {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// pub fn sort_containers(i: &mut [ContainerSummary], so: SortedOrder, header: Header) -> &[ContainerSummary] {
|
||||||
|
// match header {
|
||||||
|
// Header::State => {
|
||||||
|
// match so {
|
||||||
|
// SortedOrder::Asc => i.sort_by(|a,b|b.state.cmp(&a.state)),
|
||||||
|
// SortedOrder::Desc => i.sort_by(|a,b|a.state.cmp(&b.state)),
|
||||||
|
// }
|
||||||
|
|
||||||
|
// },
|
||||||
|
// Header::Image => {
|
||||||
|
// match so {
|
||||||
|
// SortedOrder::Asc => i.sort_by(|a,b|b.image.cmp(&a.image)),
|
||||||
|
// SortedOrder::Desc => i.sort_by(|a,b|a.image.cmp(&b.image)),
|
||||||
|
// }
|
||||||
|
// },
|
||||||
|
// _ => ()
|
||||||
|
// }
|
||||||
|
// i
|
||||||
|
// }
|
||||||
|
|
||||||
/// Get all current containers, handle into ContainerItem in the app_data struct rather than here
|
/// Get all current containers, handle into ContainerItem in the app_data struct rather than here
|
||||||
/// Just make sure that items sent are guaranteed to have an id
|
/// Just make sure that items sent are guaranteed to have an id
|
||||||
/// return Vec<(is_running, id)>
|
/// return Vec<(is_running, id)>
|
||||||
@@ -143,7 +163,14 @@ impl DockerData {
|
|||||||
.filter(|i| i.id.is_some())
|
.filter(|i| i.id.is_some())
|
||||||
.for_each(|c| output.push(c.to_owned()));
|
.for_each(|c| output.push(c.to_owned()));
|
||||||
|
|
||||||
|
|
||||||
|
// containers.so
|
||||||
|
// let a = Self::sort_containers(&mut output, SortedOrder::Asc, Header::State);
|
||||||
|
|
||||||
self.app_data.lock().update_containers(&output);
|
self.app_data.lock().update_containers(&output);
|
||||||
|
|
||||||
|
// self.app_data.lock().sort_containers(SortedOrder::Asc, Header::State);
|
||||||
|
|
||||||
output
|
output
|
||||||
.iter()
|
.iter()
|
||||||
.filter_map(|i| {
|
.filter_map(|i| {
|
||||||
@@ -214,6 +241,7 @@ impl DockerData {
|
|||||||
};
|
};
|
||||||
|
|
||||||
self.update_all_container_stats(&all_ids).await;
|
self.update_all_container_stats(&all_ids).await;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Animate the loading icon
|
/// Animate the loading icon
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
#![allow(unused)]
|
||||||
use app_data::AppData;
|
use app_data::AppData;
|
||||||
use app_error::AppError;
|
use app_error::AppError;
|
||||||
use bollard::Docker;
|
use bollard::Docker;
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ use tui::{
|
|||||||
Frame,
|
Frame,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
use crate::app_data::{SortedOrder, Header};
|
||||||
use crate::{
|
use crate::{
|
||||||
app_data::{AppData, ByteStats, Columns, CpuStats, State, Stats},
|
app_data::{AppData, ByteStats, Columns, CpuStats, State, Stats},
|
||||||
app_error::AppError,
|
app_error::AppError,
|
||||||
@@ -123,6 +124,8 @@ pub fn draw_containers<B: Backend>(
|
|||||||
widths: &Columns,
|
widths: &Columns,
|
||||||
) {
|
) {
|
||||||
let block = generate_block(app_data, area, gui_state, SelectablePanel::Containers);
|
let block = generate_block(app_data, area, gui_state, SelectablePanel::Containers);
|
||||||
|
app_data.lock().sort_containers(SortedOrder::Asc);
|
||||||
|
|
||||||
|
|
||||||
let items = app_data
|
let items = app_data
|
||||||
.lock()
|
.lock()
|
||||||
|
|||||||
Reference in New Issue
Block a user