1use crate::environment::{parse_environment, Environment};
2use serde::{Deserialize, Serialize};
3use syn::{
4 parse::{Parse, ParseStream},
5 token, Ident, LitStr,
6};
7
8#[derive(Debug, Clone, Serialize, Deserialize)]
9pub struct Cron {
10 pub name: Option<String>,
11 pub schedule: String,
12 pub environment: Environment,
13}
14
15impl Parse for Cron {
16 fn parse(input: ParseStream) -> syn::Result<Self> {
17 let mut name = None;
18 let mut environment = Environment::default();
19 let mut schedule = None;
20
21 while !input.is_empty() {
22 let ident: Ident = input.parse()?;
23 input.parse::<token::Eq>()?;
24
25 match ident.to_string().as_str() {
26 "name" => {
27 name = Some(input.parse::<LitStr>()?.value());
28 }
29 "environment" => {
30 environment = parse_environment(input)?;
31 }
32 "schedule" => {
33 schedule = Some(input.parse::<LitStr>()?.value());
34 }
35 _ => {}
37 }
38
39 if !input.is_empty() {
40 input.parse::<token::Comma>()?;
41 }
42 }
43
44 let Some(schedule) = schedule else {
45 return Err(input.error("Cron validation failed: no schedule provided"));
46 };
47
48 Ok(Cron {
49 name,
50 environment,
51 schedule,
52 })
53 }
54}