Skip to content

Commit baae118

Browse files
committed
improve DateTime parsing
1 parent 7efaff4 commit baae118

5 files changed

Lines changed: 62 additions & 12 deletions

File tree

Cargo.lock

Lines changed: 13 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ config = { version = "0.15.11" }
2222
const-str = { version = "0.7.0", features = ["proc"] }
2323
console-subscriber = { version = "0.4.1" }
2424
cute_custom_default = { version = "2.2.0" }
25+
dateparser = { version = "0.2.1" }
2526
derivative = { version = "2.2.0" }
2627
derive_more = { version = "2.0.1" }
2728
dirs = { version = "6.0.0" }

kuma-client/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ private-api = []
1515
uptime-kuma-v1 = []
1616

1717
[dependencies]
18+
dateparser = { workspace = true }
1819
config = { workspace = true }
1920
const-str = { workspace = true }
2021
derivative = { workspace = true }

kuma-client/src/client.rs

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -238,24 +238,44 @@ impl Worker {
238238
async fn on_event(self: &Arc<Self>, event: Event, payload: Value) -> Result<()> {
239239
match event {
240240
Event::MonitorList => {
241-
self.on_monitor_list(serde_json::from_value(payload).unwrap())
242-
.await?
241+
self.on_monitor_list(
242+
serde_json::from_value(payload)
243+
.log_error(module_path!(), |_| "Failed to deserialize MonitorList")
244+
.unwrap(),
245+
)
246+
.await?
243247
}
244248
Event::NotificationList => {
245-
self.on_notification_list(serde_json::from_value(payload).unwrap())
246-
.await?
249+
self.on_notification_list(
250+
serde_json::from_value(payload)
251+
.log_error(module_path!(), |_| "Failed to deserialize NotificationList")
252+
.unwrap(),
253+
)
254+
.await?
247255
}
248256
Event::MaintenanceList => {
249-
self.on_maintenance_list(serde_json::from_value(payload).unwrap())
250-
.await?
257+
self.on_maintenance_list(
258+
serde_json::from_value(payload)
259+
.log_error(module_path!(), |_| "Failed to deserialize MaintenanceList")
260+
.unwrap(),
261+
)
262+
.await?
251263
}
252264
Event::StatusPageList => {
253-
self.on_status_page_list(serde_json::from_value(payload).unwrap())
254-
.await?
265+
self.on_status_page_list(
266+
serde_json::from_value(payload)
267+
.log_error(module_path!(), |_| "Failed to deserialize StatusPageList")
268+
.unwrap(),
269+
)
270+
.await?
255271
}
256272
Event::DockerHostList => {
257-
self.on_docker_host_list(serde_json::from_value(payload).unwrap())
258-
.await?
273+
self.on_docker_host_list(
274+
serde_json::from_value(payload)
275+
.log_error(module_path!(), |_| "Failed to deserialize DockerHostList")
276+
.unwrap(),
277+
)
278+
.await?
259279
}
260280
Event::Info => self.on_info().await?,
261281
Event::AutoLogin => self.on_auto_login().await?,

kuma-client/src/deserialize.rs

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -233,8 +233,23 @@ impl<'de> DeserializeAs<'de, Option<Range<PrimitiveDateTime>>> for SerializeDate
233233
let value = source
234234
.into_iter()
235235
.map(|o| {
236-
o.map(|s| PrimitiveDateTime::parse(&s, &Iso8601::DATE_TIME))
237-
.transpose()
236+
o.map(|s| -> Result<PrimitiveDateTime, D::Error> {
237+
if let Ok(dt) = dateparser::parse(&s) {
238+
return Ok(PrimitiveDateTime::parse(
239+
&dt.to_rfc3339(),
240+
&Iso8601::DATE_TIME,
241+
)
242+
.unwrap());
243+
}
244+
if let Ok(dt) = PrimitiveDateTime::parse(&s, &Iso8601::DATE_TIME) {
245+
return Ok(dt);
246+
}
247+
Err(serde::de::Error::custom(format!(
248+
"Unable to parse {} as DateTime",
249+
s
250+
)))
251+
})
252+
.transpose()
238253
})
239254
.collect::<Result<Vec<_>, _>>()
240255
.map_err(serde::de::Error::custom)?;

0 commit comments

Comments
 (0)