use std::fmt;
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct CronJob {
pub uid: usize,
pub fingerprint: u64,
pub tag: Option<String>,
pub schedule: String,
pub command: String,
pub description: Option<JobDescription>,
pub section: Option<JobSection>,
}
impl fmt::Display for CronJob {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
if let Some(description) = &self.description {
write!(f, "{description}")
} else {
write!(f, "{} {}", self.schedule, self.command)
}
}
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct IgnoredJob {
pub tag: Option<String>,
pub schedule: String,
pub command: String,
pub description: Option<JobDescription>,
pub section: Option<JobSection>,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct Variable {
pub identifier: String,
pub value: String,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum CommentKind {
Regular,
Description,
Section,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct Comment {
pub value: String,
pub kind: CommentKind,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct JobDescription(pub String);
impl fmt::Display for JobDescription {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.0)
}
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct JobSection {
pub uid: u32,
pub title: String,
}
impl fmt::Display for JobSection {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.title)
}
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct Unknown {
pub value: String,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum Token {
CronJob(CronJob),
IgnoredJob(IgnoredJob),
Variable(Variable),
Comment(Comment),
Unknown(Unknown),
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn cronjob_display_with_description() {
let cronjob = CronJob {
uid: 1,
fingerprint: 13_376_942,
tag: None,
schedule: String::from("@hourly"),
command: String::from("sleep 3599"),
description: Some(JobDescription(String::from("Sleep (almost) forever."))),
section: None,
};
let job_display = cronjob.to_string();
assert_eq!(job_display, "Sleep (almost) forever.");
}
#[test]
fn cronjob_display_without_description() {
let cronjob = CronJob {
uid: 1,
fingerprint: 13_376_942,
tag: None,
schedule: String::from("@hourly"),
command: String::from("sleep 3599"),
description: None,
section: None,
};
let job_display = cronjob.to_string();
assert_eq!(job_display, "@hourly sleep 3599");
}
#[test]
fn job_description_display() {
let description = JobDescription(String::from("hello, world"));
assert_eq!(description.to_string(), "hello, world");
}
#[test]
fn job_description_section() {
let section = JobSection {
uid: 36,
title: String::from("foo bar baz"),
};
assert_eq!(section.to_string(), "foo bar baz");
}
}