use std::collections::HashMap;
use std::fmt;
use std::time::Duration;
use crate::config::DEFAULT_JOB_DELAY;
use crate::config::DEFAULT_JOB_PRIORITY;
use crate::error::BeanstalkcResult;
use crate::Beanstalkc;
#[derive(Debug)]
pub struct Job<'a> {
conn: &'a mut Beanstalkc,
id: u64,
body: Vec<u8>,
reserved: bool,
}
impl<'a> fmt::Display for Job<'a> {
fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
write!(
f,
"Job(id: {}, reserved: {}, body: \"{:?}\")",
self.id, self.reserved, self.body
)
}
}
impl<'a> Job<'a> {
pub fn new(conn: &'a mut Beanstalkc, job_id: u64, body: Vec<u8>, reserved: bool) -> Job {
Job {
conn,
id: job_id,
body,
reserved,
}
}
pub fn id(&self) -> u64 {
self.id
}
pub fn body(&self) -> &[u8] {
&self.body[..]
}
pub fn reserved(&self) -> bool {
self.reserved
}
pub fn delete(&mut self) -> BeanstalkcResult<()> {
self.conn.delete(self.id)?;
self.reserved = false;
Ok(())
}
pub fn release_default(&mut self) -> BeanstalkcResult<()> {
let priority = self.priority();
self.release(priority, DEFAULT_JOB_DELAY)
}
pub fn release(&mut self, priority: u32, delay: Duration) -> BeanstalkcResult<()> {
if !self.reserved {
return Ok(());
}
self.conn.release(self.id, priority, delay)?;
self.reserved = false;
Ok(())
}
pub fn bury_default(&mut self) -> BeanstalkcResult<()> {
let priority = self.priority();
self.bury(priority)
}
pub fn bury(&mut self, priority: u32) -> BeanstalkcResult<()> {
if !self.reserved {
return Ok(());
}
self.conn.bury(self.id, priority)?;
self.reserved = false;
Ok(())
}
pub fn kick(&mut self) -> BeanstalkcResult<()> {
self.conn.kick_job(self.id)
}
pub fn touch(&mut self) -> BeanstalkcResult<()> {
if !self.reserved {
return Ok(());
}
self.conn.touch(self.id)
}
pub fn stats(&mut self) -> BeanstalkcResult<HashMap<String, String>> {
self.conn.stats_job(self.id)
}
fn priority(&mut self) -> u32 {
let stats = self.stats().unwrap_or_default();
stats
.get("pri")
.map(|x| x.parse().unwrap_or(DEFAULT_JOB_PRIORITY))
.unwrap_or(DEFAULT_JOB_PRIORITY)
}
}