Skip to content

Commit 057efcb

Browse files
authored
1 (#32)
1 parent 8c191e9 commit 057efcb

File tree

1 file changed

+133
-0
lines changed

1 file changed

+133
-0
lines changed

src/parser/task_log.rs

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
//! 任务日志
2+
//!
3+
//! DADK在执行任务时,会把一些日志记录到任务的文件夹下。
4+
5+
use chrono::{DateTime, Utc};
6+
use log::warn;
7+
use serde::{Deserialize, Deserializer, Serialize};
8+
9+
/// 任务日志(输出到任务构建日志目录下的)
10+
#[derive(Debug, Clone, Serialize, Deserialize)]
11+
pub struct TaskLog {
12+
/// 任务执行完成时间
13+
#[serde(
14+
deserialize_with = "ok_or_default",
15+
skip_serializing_if = "Option::is_none"
16+
)]
17+
build_timestamp: Option<DateTime<Utc>>,
18+
/// 任务构建状态
19+
build_status: Option<BuildStatus>,
20+
/// 任务安装状态
21+
install_status: Option<InstallStatus>,
22+
}
23+
24+
fn ok_or_default<'a, T, D>(deserializer: D) -> Result<T, D::Error>
25+
where
26+
T: Deserialize<'a> + Default,
27+
D: Deserializer<'a>,
28+
{
29+
let r = Option::deserialize(deserializer).map(|x: Option<T>| x.unwrap_or_default());
30+
31+
Ok(r.unwrap_or_default())
32+
}
33+
34+
impl TaskLog {
35+
pub fn new() -> Self {
36+
Self {
37+
build_timestamp: None,
38+
build_status: None,
39+
install_status: None,
40+
}
41+
}
42+
43+
#[allow(dead_code)]
44+
pub fn set_build_time(&mut self, time: DateTime<Utc>) {
45+
self.build_timestamp = Some(time);
46+
}
47+
48+
#[allow(dead_code)]
49+
pub fn build_time(&self) -> Option<&DateTime<Utc>> {
50+
self.build_timestamp.as_ref()
51+
}
52+
53+
#[allow(dead_code)]
54+
pub fn set_build_time_now(&mut self) {
55+
self.build_timestamp = Some(Utc::now());
56+
}
57+
58+
pub fn set_build_status(&mut self, status: BuildStatus) {
59+
self.build_status = Some(status);
60+
}
61+
62+
pub fn clean_build_status(&mut self) {
63+
self.build_status = None;
64+
}
65+
66+
pub fn build_status(&self) -> Option<&BuildStatus> {
67+
self.build_status.as_ref()
68+
}
69+
70+
pub fn install_status(&self) -> Option<&InstallStatus> {
71+
self.install_status.as_ref()
72+
}
73+
74+
pub fn set_install_status(&mut self, status: InstallStatus) {
75+
self.install_status = Some(status);
76+
}
77+
78+
pub fn clean_install_status(&mut self) {
79+
self.install_status = None;
80+
}
81+
}
82+
83+
/// 任务构建状态
84+
#[derive(Debug, Clone, Serialize, PartialEq)]
85+
pub enum BuildStatus {
86+
#[serde(rename = "success")]
87+
Success,
88+
#[serde(rename = "failed")]
89+
Failed,
90+
}
91+
92+
impl<'de> Deserialize<'de> for BuildStatus {
93+
fn deserialize<D>(deserializer: D) -> Result<BuildStatus, D::Error>
94+
where
95+
D: Deserializer<'de>,
96+
{
97+
let s = String::deserialize(deserializer)?.to_ascii_lowercase();
98+
match s.as_str() {
99+
"success" => Ok(BuildStatus::Success),
100+
"failed" => Ok(BuildStatus::Failed),
101+
_ => {
102+
warn!("invalid build status: {}", s);
103+
Ok(BuildStatus::Failed)
104+
}
105+
}
106+
}
107+
}
108+
109+
/// 任务安装状态
110+
#[derive(Debug, Clone, Serialize, PartialEq)]
111+
pub enum InstallStatus {
112+
#[serde(rename = "success")]
113+
Success,
114+
#[serde(rename = "failed")]
115+
Failed,
116+
}
117+
118+
impl<'de> Deserialize<'de> for InstallStatus {
119+
fn deserialize<D>(deserializer: D) -> Result<InstallStatus, D::Error>
120+
where
121+
D: Deserializer<'de>,
122+
{
123+
let s = String::deserialize(deserializer)?.to_ascii_lowercase();
124+
match s.as_str() {
125+
"success" => Ok(InstallStatus::Success),
126+
"failed" => Ok(InstallStatus::Failed),
127+
_ => {
128+
warn!("invalid install status: {}", s);
129+
Ok(InstallStatus::Failed)
130+
}
131+
}
132+
}
133+
}

0 commit comments

Comments
 (0)