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 pub id: i64,
64
65 pub name: String,
67
68 pub command: String,
70
71 pub args: Vec<String>,
73
74 pub group: Option<String>,
76
77 pub dir: Option<String>,
79
80 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}