Skip to main content

cargo_hammerwork/utils/
validation.rs

1use anyhow::Result;
2use hammerwork::JobPriority;
3use std::str::FromStr;
4
5pub fn validate_priority(priority: &str) -> Result<JobPriority> {
6    match priority.to_lowercase().as_str() {
7        "background" => Ok(JobPriority::Background),
8        "low" => Ok(JobPriority::Low),
9        "normal" => Ok(JobPriority::Normal),
10        "high" => Ok(JobPriority::High),
11        "critical" => Ok(JobPriority::Critical),
12        _ => Err(anyhow::anyhow!(
13            "Invalid priority '{}'. Valid options: background, low, normal, high, critical",
14            priority
15        )),
16    }
17}
18
19pub fn validate_status(status: &str) -> Result<()> {
20    match status.to_lowercase().as_str() {
21        "pending" | "running" | "completed" | "failed" | "dead" | "retrying" | "timed_out" => {
22            Ok(())
23        }
24        _ => Err(anyhow::anyhow!(
25            "Invalid status '{}'. Valid options: pending, running, completed, failed, dead, retrying, timed_out",
26            status
27        )),
28    }
29}
30
31pub fn validate_json_payload(payload: &str) -> Result<serde_json::Value> {
32    serde_json::from_str(payload).map_err(|e| anyhow::anyhow!("Invalid JSON payload: {}", e))
33}
34
35pub fn validate_database_url(url: &str) -> Result<()> {
36    if url.starts_with("postgres://")
37        || url.starts_with("postgresql://")
38        || url.starts_with("mysql://")
39    {
40        Ok(())
41    } else {
42        Err(anyhow::anyhow!(
43            "Invalid database URL. Must start with postgres://, postgresql://, or mysql://"
44        ))
45    }
46}
47
48pub fn validate_cron_expression(cron: &str) -> Result<()> {
49    cron::Schedule::from_str(cron)
50        .map_err(|e| anyhow::anyhow!("Invalid cron expression '{}': {}", cron, e))?;
51    Ok(())
52}