psutil 5.4.0

Process and system monitoring library
Documentation
use std::io;

use crate::{Error, Pid};

pub type ProcessResult<T> = std::result::Result<T, ProcessError>;

#[derive(Debug, thiserror::Error)]
pub enum ProcessError {
	#[error("Process {} does not exist", pid)]
	NoSuchProcess { pid: Pid },

	#[error("Process {} is a zombie", pid)]
	ZombieProcess { pid: Pid },

	#[error("Access denied for process {}", pid)]
	AccessDenied { pid: Pid },

	#[error("psutil error for process {}: {}", pid, source)]
	PsutilError { pid: Pid, source: Error },
}

pub(crate) fn psutil_error_to_process_error(e: Error, pid: Pid) -> ProcessError {
	match e {
		Error::ReadFile { source, .. } | Error::OsError { source, .. } => {
			io_error_to_process_error(source, pid)
		}
		_ => ProcessError::PsutilError { pid, source: e },
	}
}

pub(crate) fn io_error_to_process_error(e: io::Error, pid: Pid) -> ProcessError {
	match e.kind() {
		io::ErrorKind::NotFound => ProcessError::NoSuchProcess { pid },
		io::ErrorKind::PermissionDenied => ProcessError::AccessDenied { pid },
		_ => ProcessError::PsutilError {
			pid,
			source: Error::OsError { source: e },
		},
	}
}