Skip to main content

substrate_core/
schedule_port.rs

1//! SchedulePort — cron/interval/daily/weekly triggers with `next_run`.
2//!
3//! Core defines trigger shapes and the port contract; `substrate-schedule`
4//! wraps a vetted cron library for expression parsing.
5
6use serde::{Deserialize, Serialize};
7
8use crate::error::Result;
9
10/// Day-of-week for weekly schedules (0 = Sunday … 6 = Saturday).
11#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
12pub enum Weekday {
13    /// Sunday.
14    Sun = 0,
15    /// Monday.
16    Mon = 1,
17    /// Tuesday.
18    Tue = 2,
19    /// Wednesday.
20    Wed = 3,
21    /// Thursday.
22    Thu = 4,
23    /// Friday.
24    Fri = 5,
25    /// Saturday.
26    Sat = 6,
27}
28
29/// A schedule trigger specification.
30#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
31pub enum ScheduleTrigger {
32    /// Standard five-field cron expression (minute hour dom month dow).
33    Cron {
34        /// Cron expression string.
35        expr: String,
36    },
37    /// Fire every `every_secs` seconds after the anchor.
38    Interval {
39        /// Period in seconds (must be > 0).
40        every_secs: u64,
41    },
42    /// Fire once per day at `hour:minute` UTC.
43    Daily {
44        /// Hour 0–23.
45        hour: u8,
46        /// Minute 0–59.
47        minute: u8,
48    },
49    /// Fire once per week on `weekday` at `hour:minute` UTC.
50    Weekly {
51        /// Day of week.
52        weekday: Weekday,
53        /// Hour 0–23.
54        hour: u8,
55        /// Minute 0–59.
56        minute: u8,
57    },
58}
59
60/// Opaque instant for schedule calculations (unix epoch seconds).
61#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
62pub struct ScheduleInstant {
63    /// Seconds since the Unix epoch.
64    pub secs: i64,
65}
66
67/// Computes the next fire time for a [`ScheduleTrigger`].
68pub trait SchedulePort: Send + Sync {
69    /// Return the next fire instant strictly after `after`.
70    fn next_run(
71        &self,
72        trigger: &ScheduleTrigger,
73        after: ScheduleInstant,
74    ) -> Result<ScheduleInstant>;
75}