wrangler/deploy/
schedule.rs

1use crate::http;
2use crate::settings::global_user::GlobalUser;
3
4use anyhow::Result;
5
6#[derive(Clone, Debug, PartialEq)]
7pub struct ScheduleTarget {
8    pub account_id: String,
9    pub script_name: String,
10    pub crons: Vec<String>,
11}
12
13impl ScheduleTarget {
14    pub fn deploy(&self, user: &GlobalUser) -> Result<Vec<String>> {
15        log::info!("publishing schedules");
16        let schedule_worker_addr = format!(
17            "https://api.cloudflare.com/client/v4/accounts/{}/workers/scripts/{}/schedules",
18            self.account_id, self.script_name,
19        );
20
21        let client = http::legacy_auth_client(user);
22
23        log::info!("Pushing {} schedule(s)...", self.crons.len());
24        let res = client
25            .put(&schedule_worker_addr)
26            .header("Content-Type", "application/json")
27            .body(build_schedules_request(&self.crons))
28            .send()?;
29
30        let status = res.status();
31        let text = res.text()?;
32        if !status.is_success() {
33            anyhow::bail!(crate::format_api_errors(text))
34        }
35
36        Ok(self.crons.clone())
37    }
38}
39
40fn build_schedules_request(crons: &[String]) -> String {
41    let values = crons
42        .iter()
43        .map(|s| serde_json::json!({ "cron": s }))
44        .collect();
45    serde_json::Value::Array(values).to_string()
46}