use crate::JobId;
#[cfg(doc)]
use crate::{Client, Job};
use super::utils::Empty;
#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize)]
#[serde(rename_all = "lowercase")]
#[non_exhaustive]
pub enum JobSet {
#[default]
Scheduled,
Retries,
Dead,
}
#[derive(Clone, Default, Debug, PartialEq, Eq, Serialize)]
#[non_exhaustive]
pub struct Filter<'a> {
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "jobtype")]
pub(crate) kind: Option<&'a str>,
#[serde(skip_serializing_if = "Empty::is_empty")]
pub(crate) jids: Option<&'a [&'a JobId]>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "regexp")]
pub(crate) pattern: Option<&'a str>,
}
impl Empty for &Filter<'_> {
fn is_empty(&self) -> bool {
self.jids.is_empty() && self.kind.is_none() && self.pattern.is_none()
}
}
impl<'a> Filter<'a> {
pub fn empty() -> Self {
Self::default()
}
pub fn from_ids(ids: &'a [&JobId]) -> Self {
Self {
jids: Some(ids),
..Default::default()
}
}
pub fn from_kind(job_kind: &'a str) -> Self {
Self {
kind: Some(job_kind),
..Default::default()
}
}
pub fn from_pattern(pattern: &'a str) -> Self {
Self {
pattern: Some(pattern),
..Default::default()
}
}
pub fn from_kind_and_pattern(job_kind: &'a str, pattern: &'a str) -> Self {
Self {
kind: Some(job_kind),
pattern: Some(pattern),
jids: None,
}
}
}
#[cfg(test)]
mod test {
use super::Filter;
#[test]
fn filter_is_serialized_correctly() {
let filter = Filter::empty();
let ser = serde_json::to_string(&filter).unwrap();
assert_eq!(ser, "{}");
let filter = Filter::from_ids(&[]);
let ser = serde_json::to_string(&filter).unwrap();
assert_eq!(ser, "{}")
}
}