cargo_hammerwork/utils/
validation.rs1use 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}