watchmend/common/
task.rs

1use serde::{Deserialize, Serialize};
2use std::{
3    collections::HashMap,
4    time::{SystemTime, UNIX_EPOCH},
5};
6
7fn default_u64_0() -> u64 {
8    0
9}
10
11fn default_none() -> Option<u64> {
12    None
13}
14
15fn default_false() -> bool {
16    false
17}
18
19#[derive(Debug, Clone, Serialize, Deserialize)]
20pub struct ScheduledTask {
21    pub year: Option<i32>,
22    pub month: Option<u32>,
23    pub day: Option<u32>,
24    pub hour: Option<u32>,
25    pub minute: Option<u32>,
26    pub second: Option<u32>,
27}
28
29#[derive(Debug, Clone, Serialize, Deserialize)]
30pub struct AsyncTask {
31    #[serde(default = "default_none")]
32    pub max_restart: Option<u64>,
33    #[serde(default = "default_u64_0")]
34    pub has_restart: u64,
35    #[serde(default = "default_u64_0")]
36    pub started_at: u64,
37    #[serde(default = "default_u64_0")]
38    pub stopped_at: u64,
39}
40
41#[derive(Debug, Clone, Serialize, Deserialize)]
42pub struct PeriodicTask {
43    #[serde(default = "default_u64_0")]
44    pub started_after: u64,
45    pub interval: u64,
46    #[serde(default = "default_u64_0")]
47    pub last_run: u64,
48    #[serde(default = "default_false")]
49    pub sync: bool,
50}
51
52#[derive(Debug, Clone, Serialize, Deserialize)]
53pub enum TaskType {
54    Scheduled(ScheduledTask),
55    Async(AsyncTask),
56    Periodic(PeriodicTask),
57    None,
58}
59
60#[derive(Debug, Clone, Serialize, Deserialize)]
61pub struct Task {
62    /// Task id (unique)
63    pub id: i64,
64
65    /// Task name (unique)
66    pub name: String,
67
68    /// Task command
69    pub command: String,
70
71    /// Task arguments
72    pub args: Vec<String>,
73
74    /// Task group
75    pub group: Option<String>,
76
77    /// Task working directory
78    pub dir: Option<String>,
79
80    /// Task environment variables
81    pub env: HashMap<String, String>,
82
83    pub stdin: Option<bool>,
84    pub stdout: Option<String>,
85    pub stderr: Option<String>,
86
87    #[serde(default = "default_created_at")]
88    pub created_at: u64,
89    pub task_type: TaskType,
90
91    pub pid: Option<u32>,
92
93    #[serde(default = "default_status")]
94    pub status: Option<String>,
95    pub code: Option<i32>,
96}
97
98fn default_created_at() -> u64 {
99    let now = SystemTime::now();
100    let timestamp = now
101        .duration_since(UNIX_EPOCH)
102        .expect("Failed to get timestamp")
103        .as_secs();
104    timestamp
105}
106
107fn default_status() -> Option<String> {
108    Some("added".to_owned())
109}
110
111impl Default for Task {
112    fn default() -> Self {
113        let now = SystemTime::now();
114        let timestamp = now
115            .duration_since(UNIX_EPOCH)
116            .expect("Failed to get timestamp")
117            .as_secs();
118        Task {
119            id: 0,
120            name: "Default".to_string(),
121            command: String::new(),
122            args: vec![],
123            group: None,
124            dir: None,
125            env: HashMap::new(),
126            stdin: None,
127            stdout: None,
128            stderr: None,
129            created_at: timestamp,
130            task_type: TaskType::None,
131            pid: None,
132            status: None,
133            code: None,
134        }
135    }
136}
137
138unsafe impl Send for Task {}
139unsafe impl Sync for Task {}
140
141#[derive(Debug, Clone, Serialize, Deserialize)]
142pub struct TaskFlag {
143    pub id: i64,
144    pub name: Option<String>,
145    pub group: Option<String>,
146    pub mat: bool,
147}
148
149impl Default for TaskFlag {
150    fn default() -> Self {
151        TaskFlag {
152            id: 0,
153            name: Some(String::new()),
154            group: None,
155            mat: false,
156        }
157    }
158}
159
160unsafe impl Send for TaskFlag {}
161unsafe impl Sync for TaskFlag {}
162
163#[derive(Debug, Clone, Serialize, Deserialize)]
164pub struct Tasks {
165    pub task: Vec<Task>,
166}