use heim_common::prelude::*;
use winapi::um::minwinbase;
use super::bindings;
use crate::{Pid, ProcessError, ProcessResult};
#[allow(clippy::useless_conversion)]
pub async fn pids() -> Result<impl Stream<Item = Result<Pid>>> {
let pids = bindings::pids()?.into_iter().map(|pid| Ok(Pid::from(pid)));
Ok(stream::iter(pids))
}
pub async fn pid_exists(pid: Pid) -> ProcessResult<bool> {
if pid == 0 {
return Ok(true);
}
let process = match bindings::ProcessHandle::query_limited_info(pid) {
Ok(process) => process,
Err(ProcessError::NoSuchProcess(..)) => return Ok(false),
Err(ProcessError::AccessDenied(..)) => return Ok(true),
Err(e) => return Err(e),
};
match process.exit_code() {
Ok(code) if code == minwinbase::STILL_ACTIVE => Ok(true),
Ok(..) => {
let pids = bindings::pids().map_err(Error::from)?;
Ok(pids.contains(&pid))
}
Err(e) => Err(e),
}
}