use crate::{sys, SBProcess, SBQueueItem, SBThread};
use std::ffi::CStr;
pub struct SBQueue {
pub raw: sys::SBQueueRef,
}
impl SBQueue {
pub(crate) fn wrap(raw: sys::SBQueueRef) -> SBQueue {
SBQueue { raw }
}
pub(crate) fn maybe_wrap(raw: sys::SBQueueRef) -> Option<SBQueue> {
if unsafe { sys::SBQueueIsValid(raw) } {
Some(SBQueue { raw })
} else {
None
}
}
pub fn is_valid(&self) -> bool {
unsafe { sys::SBQueueIsValid(self.raw) }
}
#[allow(missing_docs)]
pub fn process(&self) -> SBProcess {
SBProcess::wrap(unsafe { sys::SBQueueGetProcess(self.raw) })
}
pub fn queue_id(&self) -> u64 {
unsafe { sys::SBQueueGetQueueID(self.raw) }
}
pub fn name(&self) -> &str {
unsafe {
match CStr::from_ptr(sys::SBQueueGetName(self.raw)).to_str() {
Ok(s) => s,
_ => panic!("Invalid string?"),
}
}
}
pub fn threads(&self) -> SBQueueThreadIter {
SBQueueThreadIter {
queue: self,
idx: 0,
}
}
pub fn pending_items(&self) -> SBQueueQueueItemIter {
SBQueueQueueItemIter {
queue: self,
idx: 0,
}
}
pub fn num_running_items(&self) -> u32 {
unsafe { sys::SBQueueGetNumRunningItems(self.raw) }
}
pub fn kind(&self) -> sys::QueueKind {
unsafe { sys::SBQueueGetKind(self.raw) }
}
}
impl Clone for SBQueue {
fn clone(&self) -> SBQueue {
SBQueue {
raw: unsafe { sys::CloneSBQueue(self.raw) },
}
}
}
impl Drop for SBQueue {
fn drop(&mut self) {
unsafe { sys::DisposeSBQueue(self.raw) };
}
}
unsafe impl Send for SBQueue {}
unsafe impl Sync for SBQueue {}
pub struct SBQueueThreadIter<'d> {
queue: &'d SBQueue,
idx: usize,
}
impl<'d> Iterator for SBQueueThreadIter<'d> {
type Item = SBThread;
fn next(&mut self) -> Option<SBThread> {
if self.idx < unsafe { sys::SBQueueGetNumThreads(self.queue.raw) as usize } {
let r = Some(SBThread::wrap(unsafe {
sys::SBQueueGetThreadAtIndex(self.queue.raw, self.idx as u32)
}));
self.idx += 1;
r
} else {
None
}
}
fn size_hint(&self) -> (usize, Option<usize>) {
let sz = unsafe { sys::SBQueueGetNumThreads(self.queue.raw) } as usize;
(sz - self.idx, Some(sz))
}
}
impl<'d> ExactSizeIterator for SBQueueThreadIter<'d> {}
pub struct SBQueueQueueItemIter<'d> {
queue: &'d SBQueue,
idx: usize,
}
impl<'d> Iterator for SBQueueQueueItemIter<'d> {
type Item = SBQueueItem;
fn next(&mut self) -> Option<SBQueueItem> {
if self.idx < unsafe { sys::SBQueueGetNumPendingItems(self.queue.raw) as usize } {
let r = Some(SBQueueItem::wrap(unsafe {
sys::SBQueueGetPendingItemAtIndex(self.queue.raw, self.idx as u32)
}));
self.idx += 1;
r
} else {
None
}
}
fn size_hint(&self) -> (usize, Option<usize>) {
let sz = unsafe { sys::SBQueueGetNumPendingItems(self.queue.raw) } as usize;
(sz - self.idx, Some(sz))
}
}
impl<'d> ExactSizeIterator for SBQueueQueueItemIter<'d> {}
#[cfg(feature = "graphql")]
#[graphql_object]
impl SBQueue {
fn queue_id() -> i32 {
self.queue_id() as i32
}
fn name() -> &str {
self.name()
}
fn threads() -> Vec<SBThread> {
self.threads().collect()
}
fn pending_items() -> Vec<SBQueueItem> {
self.pending_items().collect()
}
fn num_running_items() -> i32 {
self.num_running_items() as i32
}
}