diff options
author | Clement Tsang <34804052+ClementTsang@users.noreply.github.com> | 2020-08-07 01:29:20 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-08-07 04:29:20 -0400 |
commit | 30bdaa6073ad28eb1083997e874654727460fcbb (patch) | |
tree | 07a373b3f2493c9c6e2872ceec617127ee5dc8d8 /src/data_conversion.rs | |
parent | d2129056e3f04c961a28099510d3bd577925af47 (diff) |
feature: add full command to process widget
This PR adds the ability to toggle between the process name and process path. Currently, this uses `P` as the modifier key.
Currently, the longer command names are dealt with by forcefully changing the width of the columns, but this can be handled in a more graceful manner IMO.
Diffstat (limited to 'src/data_conversion.rs')
-rw-r--r-- | src/data_conversion.rs | 201 |
1 files changed, 112 insertions, 89 deletions
diff --git a/src/data_conversion.rs b/src/data_conversion.rs index 5081d04f..200ac998 100644 --- a/src/data_conversion.rs +++ b/src/data_conversion.rs @@ -359,99 +359,122 @@ pub fn convert_network_data_points( } } +pub enum ProcessGroupingType { + Grouped, + Ungrouped, +} + +pub enum ProcessNamingType { + Name, + Path, +} + pub fn convert_process_data( - current_data: &data_farmer::DataCollection, -) -> (Vec<ConvertedProcessData>, Vec<ConvertedProcessData>) { - let mut single_list = Vec::new(); - - // cpu, mem, pids - let mut grouped_hashmap: HashMap<String, SingleProcessData> = std::collections::HashMap::new(); - - // Go through every single process in the list... and build a hashmap + single list - for process in &(current_data).process_harvest { - let entry = grouped_hashmap - .entry(process.name.clone()) - .or_insert(SingleProcessData { - pid: process.pid, - ..SingleProcessData::default() + current_data: &data_farmer::DataCollection, grouping_type: ProcessGroupingType, + name_type: ProcessNamingType, +) -> Vec<ConvertedProcessData> { + match grouping_type { + ProcessGroupingType::Ungrouped => current_data + .process_harvest + .iter() + .map(|process| { + let converted_rps = get_exact_byte_values(process.read_bytes_per_sec, false); + let converted_wps = get_exact_byte_values(process.write_bytes_per_sec, false); + let converted_total_read = get_exact_byte_values(process.total_read_bytes, false); + let converted_total_write = get_exact_byte_values(process.total_write_bytes, false); + + let read_per_sec = format!("{:.*}{}/s", 0, converted_rps.0, converted_rps.1); + let write_per_sec = format!("{:.*}{}/s", 0, converted_wps.0, converted_wps.1); + let total_read = + format!("{:.*}{}", 0, converted_total_read.0, converted_total_read.1); + let total_write = format!( + "{:.*}{}", + 0, converted_total_write.0, converted_total_write.1 + ); + + ConvertedProcessData { + pid: process.pid, + name: match name_type { + ProcessNamingType::Name => process.name.to_string(), + ProcessNamingType::Path => process.path.to_string(), + }, + cpu_usage: process.cpu_usage_percent, + mem_usage: process.mem_usage_percent, + group_pids: vec![process.pid], + read_per_sec, + write_per_sec, + total_read, + total_write, + rps_f64: process.read_bytes_per_sec as f64, + wps_f64: process.write_bytes_per_sec as f64, + tr_f64: process.total_read_bytes as f64, + tw_f64: process.total_write_bytes as f64, + process_states: process.process_state.to_owned(), + } + }) + .collect::<Vec<_>>(), + ProcessGroupingType::Grouped => { + let mut grouped_hashmap: HashMap<String, SingleProcessData> = + std::collections::HashMap::new(); + + current_data.process_harvest.iter().for_each(|process| { + let entry = grouped_hashmap + .entry(match name_type { + ProcessNamingType::Name => process.name.to_string(), + ProcessNamingType::Path => process.path.to_string(), + }) + .or_insert(SingleProcessData { + pid: process.pid, + ..SingleProcessData::default() + }); + + (*entry).cpu_usage += process.cpu_usage_percent; + (*entry).mem_usage += process.mem_usage_percent; + (*entry).group_pids.push(process.pid); + (*entry).read_per_sec += process.read_bytes_per_sec; + (*entry).write_per_sec += process.write_bytes_per_sec; + (*entry).total_read += process.total_read_bytes; + (*entry).total_write += process.total_write_bytes; }); - (*entry).cpu_usage += process.cpu_usage_percent; - (*entry).mem_usage += process.mem_usage_percent; - (*entry).group_pids.push(process.pid); - (*entry).read_per_sec += process.read_bytes_per_sec; - (*entry).write_per_sec += process.write_bytes_per_sec; - (*entry).total_read += process.total_read_bytes; - (*entry).total_write += process.total_write_bytes; - - let converted_rps = get_exact_byte_values(process.read_bytes_per_sec, false); - let converted_wps = get_exact_byte_values(process.write_bytes_per_sec, false); - let converted_total_read = get_exact_byte_values(process.total_read_bytes, false); - let converted_total_write = get_exact_byte_values(process.total_write_bytes, false); - - let read_per_sec = format!("{:.*}{}/s", 0, converted_rps.0, converted_rps.1); - let write_per_sec = format!("{:.*}{}/s", 0, converted_wps.0, converted_wps.1); - let total_read = format!("{:.*}{}", 0, converted_total_read.0, converted_total_read.1); - let total_write = format!( - "{:.*}{}", - 0, converted_total_write.0, converted_total_write.1 - ); - - single_list.push(ConvertedProcessData { - pid: process.pid, - name: process.name.to_string(), - cpu_usage: process.cpu_usage_percent, - mem_usage: process.mem_usage_percent, - group_pids: vec![process.pid], - read_per_sec, - write_per_sec, - total_read, - total_write, - rps_f64: process.read_bytes_per_sec as f64, - wps_f64: process.write_bytes_per_sec as f64, - tr_f64: process.total_read_bytes as f64, - tw_f64: process.total_write_bytes as f64, - process_states: process.process_state.to_owned(), - }); + grouped_hashmap + .iter() + .map(|(identifier, process_details)| { + let p = process_details.clone(); + let converted_rps = get_exact_byte_values(p.read_per_sec, false); + let converted_wps = get_exact_byte_values(p.write_per_sec, false); + let converted_total_read = get_exact_byte_values(p.total_read, false); + let converted_total_write = get_exact_byte_values(p.total_write, false); + + let read_per_sec = format!("{:.*}{}/s", 0, converted_rps.0, converted_rps.1); + let write_per_sec = format!("{:.*}{}/s", 0, converted_wps.0, converted_wps.1); + let total_read = + format!("{:.*}{}", 0, converted_total_read.0, converted_total_read.1); + let total_write = format!( + "{:.*}{}", + 0, converted_total_write.0, converted_total_write.1 + ); + + ConvertedProcessData { + pid: p.pid, + name: identifier.to_string(), + cpu_usage: p.cpu_usage, + mem_usage: p.mem_usage, + group_pids: p.group_pids, + read_per_sec, + write_per_sec, + total_read, + total_write, + rps_f64: p.read_per_sec as f64, + wps_f64: p.write_per_sec as f64, + tr_f64: p.total_read as f64, + tw_f64: p.total_write as f64, + process_states: p.process_state, + } + }) + .collect::<Vec<_>>() + } } - - let grouped_list: Vec<ConvertedProcessData> = grouped_hashmap - .iter() - .map(|(name, process_details)| { - let p = process_details.clone(); - let converted_rps = get_exact_byte_values(p.read_per_sec, false); - let converted_wps = get_exact_byte_values(p.write_per_sec, false); - let converted_total_read = get_exact_byte_values(p.total_read, false); - let converted_total_write = get_exact_byte_values(p.total_write, false); - - let read_per_sec = format!("{:.*}{}/s", 0, converted_rps.0, converted_rps.1); - let write_per_sec = format!("{:.*}{}/s", 0, converted_wps.0, converted_wps.1); - let total_read = format!("{:.*}{}", 0, converted_total_read.0, converted_total_read.1); - let total_write = format!( - "{:.*}{}", - 0, converted_total_write.0, converted_total_write.1 - ); - - ConvertedProcessData { - pid: p.pid, - name: name.to_string(), - cpu_usage: p.cpu_usage, - mem_usage: p.mem_usage, - group_pids: p.group_pids, - read_per_sec, - write_per_sec, - total_read, - total_write, - rps_f64: p.read_per_sec as f64, - wps_f64: p.write_per_sec as f64, - tr_f64: p.total_read as f64, - tw_f64: p.total_write as f64, - process_states: p.process_state, - } - }) - .collect::<Vec<_>>(); - - (single_list, grouped_list) } pub fn convert_battery_harvest( |