message: bug: disk displays nothing on if IO fails to match
  Obvious on macOS.
diff: +use lazy_static::lazy_static;
  /// In charge of cleaning, processing, and managing data. I couldn't think of
  /// a better name for the file. Since I called data collection "harvesting",
  /// then this is the farmer I guess.
  /// call the purging function. Failure to do so *will* result in a growing
  /// memory usage and higher CPU usage - you will be trying to process more and
  /// more points as this is used!
  -use std::time::Instant;
  -use std::vec::Vec;
  +use std::{time::Instant, vec::Vec};
  use crate::data_harvester::{
  battery_harvester, cpu, disks, mem, network, processes, temperature, Data,
  };
  +use regex::Regex;
  pub type TimeOffset = f64;
  pub type Value = f64;
  @@ -230,25 +231,41 @@ impl DataCollection {
  for (itx, device) in disks.iter().enumerate() {
  if let Some(trim) = device.name.split('/').last() {
  - let io_device = io.get(trim);
  - if let Some(io) = io_device {
  - let io_r_pt = io.read_bytes;
  - let io_w_pt = io.write_bytes;
  + let io_device = if cfg!(target_os = "macos") {
  + // Must trim one level further!
  +
  + lazy_static! {
  + static ref DISK_REGEX: Regex = Regex::new(r"disk\d+").unwrap();
  + }
  + if let Some(disk_trim) = DISK_REGEX.find(trim) {
  + io.get(disk_trim.as_str())
  + } else {
  + None
  + }
  + } else {
  + io.get(trim)
  + };
  + let (io_r_pt, io_w_pt) = if let Some(io) = io_device {
  + (io.read_bytes, io.write_bytes)
  + } else {
  + (0, 0)
  + };
  if self.io_labels_and_prev.len() <= itx {
  self.io_labels_and_prev.push(((0, 0), (io_r_pt, io_w_pt)));
  } else if let Some((io_curr, io_prev)) = self.io_labels_and_prev.get_mut(itx) {
  - let r_rate =
  - ((io_r_pt - io_prev.0) as f64 / time_since_last_harvest).round() as u64;
  - let w_rate =
  - ((io_w_pt - io_prev.1) as f64 / time_since_last_harvest).round() as u64;
  + let r_rate = ((io_r_pt.saturating_sub(io_prev.0)) as f64
  + / time_since_last_harvest)
  + .round() as u64;
  + let w_rate = ((io_w_pt.saturating_sub(io_prev.1)) as f64
  + / time_since_last_harvest)
  + .round() as u64;
  *io_curr = (r_rate, w_rate);
  *io_prev = (io_r_pt, io_w_pt);
  }
  }
  }
  - }
  self.disk_harvest = disks.to_vec();
  self.io_harvest = io.clone();
  