use std::collections::HashMap;
use chrono::{DateTime, Utc};
use std::io::prelude::*;
use serde_json;
use std::io;
mod cmd;
mod resp;
pub use self::cmd::*;
pub use self::resp::*;
#[derive(Serialize, Deserialize, Debug)]
pub struct Job {
pub(crate) jid: String,
pub queue: String,
#[serde(rename = "jobtype")]
pub(crate) kind: String,
pub(crate) args: Vec<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_at: Option<DateTime<Utc>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub enqueued_at: Option<DateTime<Utc>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub at: Option<DateTime<Utc>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub reserve_for: Option<usize>,
#[serde(skip_serializing_if = "Option::is_none")]
pub retry: Option<usize>,
pub priority: Option<u8>,
#[serde(skip_serializing_if = "Option::is_none")]
pub backtrace: Option<usize>,
#[serde(skip_serializing)]
pub(crate) failure: Option<Failure>,
#[serde(skip_serializing_if = "HashMap::is_empty")]
#[serde(default = "HashMap::default")]
pub custom: HashMap<String, serde_json::Value>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct Failure {
retry_count: usize,
failed_at: String,
#[serde(skip_serializing_if = "Option::is_none")] next_at: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")] message: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "errtype")]
kind: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")] backtrace: Option<Vec<String>>,
}
impl Job {
pub fn new<S, A>(kind: S, args: Vec<A>) -> Self
where
S: ToString,
A: Into<serde_json::Value>,
{
use rand::{thread_rng, Rng};
let random_jid = thread_rng().gen_ascii_chars().take(16).collect();
use chrono::prelude::*;
Job {
jid: random_jid,
queue: "default".into(),
kind: kind.to_string(),
args: args.into_iter().map(|s| s.into()).collect(),
created_at: Some(Utc::now()),
enqueued_at: None,
at: None,
reserve_for: Some(600),
retry: Some(25),
priority: Some(5),
backtrace: Some(0),
failure: None,
custom: Default::default(),
}
}
pub fn kind(&self) -> &str {
&self.kind
}
pub fn args(&self) -> &[serde_json::Value] {
&self.args
}
}
pub fn write_command<W: Write, C: FaktoryCommand>(w: &mut W, command: C) -> io::Result<()> {
command.issue::<W>(w)?;
w.flush()
}
pub fn write_command_and_await_ok<X: BufRead + Write, C: FaktoryCommand>(
x: &mut X,
command: C,
) -> io::Result<()> {
write_command(x, command)?;
read_ok(x)
}