fn process_collected_raw_data()

in src/data/diskstats.rs [121:203]


fn process_collected_raw_data(buffer: Data) -> Result<ProcessedData> {
    let raw_value = match buffer {
        Data::DiskstatsRaw(ref value) => value,
        _ => panic!("Invalid Data type in raw file"),
    };
    let mut diskstats = Diskstats::new();
    diskstats.set_time(raw_value.time);
    let mut data = Vec::<Diskstat>::new();
    let reader = BufReader::new(raw_value.data.as_bytes());
    for line in reader.lines() {
        let line = line?;
        let mut s = line.split_whitespace();

        let _major = s.next().unwrap().parse::<i32>();
        let _minor = s.next().unwrap().parse::<i32>();
        let name = s.next().unwrap().to_string();
        let mut diskstat = Diskstat::new(name);

        let reads = s.next().unwrap().parse::<u64>();
        let merged = s.next().unwrap().parse::<u64>();
        let sectors_read = s.next().unwrap().parse::<u64>();
        let time_reading = s.next().unwrap().parse::<u64>();
        let writes = s.next().unwrap().parse::<u64>();
        let writes_merged = s.next().unwrap().parse::<u64>();
        let sectors_written = s.next().unwrap().parse::<u64>();
        let time_writing = s.next().unwrap().parse::<u64>();
        let in_progress = s.next().unwrap().parse::<u64>();
        let time_in_progress = s.next().unwrap().parse::<u64>();
        let weighted_time_in_progress = s.next().unwrap().parse::<u64>();
        // Following since kernel 4.18
        let discards = s.next().and_then(|s| s.parse::<u64>().ok());
        let discards_merged = s.next().and_then(|s| s.parse::<u64>().ok());
        let sectors_discarded = s.next().and_then(|s| s.parse::<u64>().ok());
        let time_discarding = s.next().and_then(|s| s.parse::<u64>().ok());
        // Following since kernel 5.5
        let flushes = s.next().and_then(|s| s.parse::<u64>().ok());
        let time_flushing = s.next().and_then(|s| s.parse::<u64>().ok());

        diskstat.add(DiskstatKeys::Reads.to_string(), reads?);
        diskstat.add(DiskstatKeys::Merged.to_string(), merged?);
        diskstat.add(DiskstatKeys::SectorsRead.to_string(), sectors_read?);
        diskstat.add(DiskstatKeys::TimeReading.to_string(), time_reading?);
        diskstat.add(DiskstatKeys::Writes.to_string(), writes?);
        diskstat.add(DiskstatKeys::WritesMerged.to_string(), writes_merged?);
        diskstat.add(DiskstatKeys::SectorsWritten.to_string(), sectors_written?);
        diskstat.add(DiskstatKeys::TimeWriting.to_string(), time_writing?);
        diskstat.add(DiskstatKeys::InProgress.to_string(), in_progress?);
        diskstat.add(DiskstatKeys::TimeInProgress.to_string(), time_in_progress?);
        diskstat.add(
            DiskstatKeys::WeightedTimeInProgress.to_string(),
            weighted_time_in_progress?,
        );
        diskstat.add(
            DiskstatKeys::Discards.to_string(),
            discards.unwrap_or_default(),
        );
        diskstat.add(
            DiskstatKeys::DiscardsMerged.to_string(),
            discards_merged.unwrap_or_default(),
        );
        diskstat.add(
            DiskstatKeys::SectorsDiscarded.to_string(),
            sectors_discarded.unwrap_or_default(),
        );
        diskstat.add(
            DiskstatKeys::TimeDiscarding.to_string(),
            time_discarding.unwrap_or_default(),
        );
        diskstat.add(
            DiskstatKeys::Flushes.to_string(),
            flushes.unwrap_or_default(),
        );
        diskstat.add(
            DiskstatKeys::TimeFlushing.to_string(),
            time_flushing.unwrap_or_default(),
        );

        data.push(diskstat);
    }
    diskstats.set_data(data);
    let processed_data = ProcessedData::Diskstats(diskstats.clone());
    Ok(processed_data)
}