diff options
author | Mark Wong <mark@2ndQuadrant.com> | 2020-11-17 05:28:18 +0000 |
---|---|---|
committer | Mark Wong <markwkm@gmail.com> | 2021-01-07 16:37:11 -0800 |
commit | 06c4cbf232abc9f5279834af42f5decd0e0a0746 (patch) | |
tree | 5f52d67cd62162d87a08329c51c2487f5da85afd | |
parent | 44942225e93b54c02c89a30e5db0173929e28fb8 (diff) |
Create separate functions for displaying each component
-rw-r--r-- | src/display.rs | 65 | ||||
-rw-r--r-- | src/pg_top.rs | 78 |
2 files changed, 76 insertions, 67 deletions
diff --git a/src/display.rs b/src/display.rs new file mode 100644 index 0000000..0498c81 --- /dev/null +++ b/src/display.rs @@ -0,0 +1,65 @@ +use crate::os; +use crate::postgresql::Backend; +use crate::PGTOP; + +use std::io::{stdout, Write}; +use termion::raw::IntoRawMode; + +pub fn loadavg(terminal_width: usize) { + let mut line = format!("load avg: {}", os::get_loadavg()); + line.truncate(terminal_width); + let mut stdout = stdout().into_raw_mode().unwrap(); + write!(stdout, "{}{}", termion::cursor::Goto(1, 1), line).unwrap(); + stdout.flush().unwrap(); +} + +pub fn process_summary(processes: Vec<Backend>, terminal_width: usize) -> Vec<Backend> { + let mut line = format!("{} processes", processes.len()); + line.truncate(terminal_width); + let mut stdout = stdout().into_raw_mode().unwrap(); + write!(stdout, "{}{}", termion::cursor::Goto(1, 2), line).unwrap(); + stdout.flush().unwrap(); + return processes; +} + +pub fn processes(processes: Vec<Backend>, terminal_width: usize) { + let mut current_line = 5; + let mut stdout = stdout().into_raw_mode().unwrap(); + for process in processes { + let mut line = format!( + "{} {} {} {} {} {} {}", + process.pid, + process.state, + process.usename, + process.xtime, + process.qtime, + process.locks, + process.query.replace("\n", ""), + ); + line.truncate(terminal_width); + write!(stdout, "{}{}", termion::cursor::Goto(1, current_line), line,).unwrap(); + stdout.flush().unwrap(); + current_line = current_line + 1; + } +} + +pub fn stat_cpu(mut pg_top: PGTOP, terminal_width: usize) -> PGTOP { + let temp = pg_top.new; + pg_top.new = pg_top.old; + pg_top.old = temp; + + pg_top.cpu.stat[pg_top.new] = os::get_stat_cpu(); + + let per = os::get_stat_cpu_percentage(pg_top.cpu.stat[pg_top.new], pg_top.cpu.stat[pg_top.old]); + + let mut line = format!( + "CPU States: {:.1}% user, {:.1}% nice, {:.1}% system, {:.1}% idle, {:.1}% iowait", + per[0], per[1], per[2], per[3], per[4] + ); + line.truncate(terminal_width); + let mut stdout = stdout().into_raw_mode().unwrap(); + write!(stdout, "{}{}", termion::cursor::Goto(1, 3), line).unwrap(); + stdout.flush().unwrap(); + + return pg_top; +} diff --git a/src/pg_top.rs b/src/pg_top.rs index a7bc201..8c949e4 100644 --- a/src/pg_top.rs +++ b/src/pg_top.rs @@ -12,10 +12,10 @@ use std::thread; use std::time::Duration; use termion::raw::IntoRawMode; -struct PGTOP { - new: usize, - old: usize, - cpu: os::CPUSTAT, +pub struct PGTOP { + pub new: usize, + pub old: usize, + pub cpu: os::CPUSTAT, } fn main() { @@ -86,77 +86,21 @@ fn main() { write!(stdout, "{}{}", termion::clear::All, termion::cursor::Hide).unwrap(); loop { - let terminal_size = termion::terminal_size().unwrap(); let mut client = postgresql::connect(&conninfo); + let mut processes = postgresql::get_processes(&mut client); + let terminal_size = termion::terminal_size().unwrap(); - let mut current_line = 1; - - write!( - stdout, - "{}load avg: {}", - termion::cursor::Goto(1, current_line), - os::get_loadavg(), - ) - .unwrap(); - stdout.flush().unwrap(); - current_line = current_line + 1; - - let processes = postgresql::get_processes(&mut client); - - write!( - stdout, - "{}{} processes", - termion::cursor::Goto(1, current_line), - processes.len(), - ) - .unwrap(); - stdout.flush().unwrap(); - current_line = current_line + 1; - - let temp = pg_top.new; - pg_top.new = pg_top.old; - pg_top.old = temp; - pg_top.cpu.stat[pg_top.new] = os::get_stat_cpu(); - let per = - os::get_stat_cpu_percentage(pg_top.cpu.stat[pg_top.new], pg_top.cpu.stat[pg_top.old]); - write!( - stdout, - "{}CPU States: {:.1}% user, {:.1}% nice, {:.1}% system, {:.1}% idle, {:.1}% iowait", - termion::cursor::Goto(1, current_line), - per[0], - per[1], - per[2], - per[3], - per[4], - ) - .unwrap(); - stdout.flush().unwrap(); - current_line = current_line + 1; - - current_line = current_line + 1; - for process in processes { - let mut line = format!( - "{} {} {} {} {} {} {}", - process.pid, - process.state, - process.usename, - process.xtime, - process.qtime, - process.locks, - process.query.replace("\n", ""), - ); - line.truncate(terminal_size.0 as usize); - write!(stdout, "{}{}", termion::cursor::Goto(1, current_line), line,).unwrap(); - stdout.flush().unwrap(); - current_line = current_line + 1; - } + display::loadavg(terminal_size.0 as usize); + processes = display::process_summary(processes, terminal_size.0 as usize); + display::processes(processes, terminal_size.0 as usize); + pg_top = display::stat_cpu(pg_top, terminal_size.0 as usize); count = count - 1; if count == 0 { write!( stdout, "{}{}", - termion::cursor::Goto(1, current_line), + termion::cursor::Goto(1, terminal_size.1), termion::cursor::Show, ) .unwrap(); |