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}