heim-cpu 0.0.11

Cross-platform CPU information
Documentation
use heim_common::prelude::*;
use heim_common::sys::unix::CLOCK_TICKS;
use heim_common::units::{time, Time};

use super::bindings;

#[derive(Debug)]
pub struct CpuTime {
    user: Time,
    nice: Time,
    system: Time,
    idle: Time,
}

impl CpuTime {
    pub fn user(&self) -> Time {
        self.user
    }

    pub fn nice(&self) -> Time {
        self.nice
    }

    pub fn system(&self) -> Time {
        self.system
    }

    pub fn idle(&self) -> Time {
        self.idle
    }
}

impl From<bindings::host_cpu_load_info> for CpuTime {
    fn from(info: bindings::host_cpu_load_info) -> CpuTime {
        let ticks = *CLOCK_TICKS;

        CpuTime {
            user: Time::new::<time::second>(f64::from(info.user) / ticks),
            nice: Time::new::<time::second>(f64::from(info.nice) / ticks),
            system: Time::new::<time::second>(f64::from(info.system) / ticks),
            idle: Time::new::<time::second>(f64::from(info.idle) / ticks),
        }
    }
}

impl From<bindings::processor_cpu_load_info> for CpuTime {
    fn from(info: bindings::processor_cpu_load_info) -> CpuTime {
        let ticks = *CLOCK_TICKS;

        CpuTime {
            user: Time::new::<time::second>(f64::from(info.user) / ticks),
            nice: Time::new::<time::second>(f64::from(info.nice) / ticks),
            system: Time::new::<time::second>(f64::from(info.system) / ticks),
            idle: Time::new::<time::second>(f64::from(info.idle) / ticks),
        }
    }
}

pub fn time() -> impl Future<Output = Result<CpuTime>> {
    future::lazy(|_| {
        let info = unsafe { bindings::cpu_load_info()? };
        Ok(info.into())
    })
}

pub fn times() -> impl Stream<Item = Result<CpuTime>> {
    future::lazy(|_| {
        let processors = unsafe { bindings::processor_load_info()? };

        let stream = stream::iter(processors).map(Ok);

        Ok(stream)
    })
    .try_flatten_stream()
    .map_ok(Into::into)
}