kinetics_parser/
cron.rs

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                // Ignore unknown attributes
36                _ => {}
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}