sponsor_block/client/user/
api_status.rs1use core::time::Duration;
3
4use chrono::{serde::ts_milliseconds, DateTime, Utc};
5use serde::Deserialize;
6use serde_json::from_str as from_json_str;
7
8use crate::{
9 error::Result,
10 util::{
11 de::{duration_from_millis_str, duration_from_seconds_str},
12 get_response_text,
13 },
14 Client,
15};
16
17#[derive(Deserialize, Debug)]
19#[serde(default)]
20pub struct ApiStatus {
21 #[serde(deserialize_with = "duration_from_seconds_str")]
23 pub uptime: Duration,
24 pub commit: String,
26 #[serde(rename = "db")]
28 pub db_version: u32,
29 #[serde(rename = "startTime", with = "ts_milliseconds")]
31 pub request_start_time: DateTime<Utc>,
32 #[serde(rename = "processTime", deserialize_with = "duration_from_millis_str")]
34 pub request_time_taken: Duration,
35 #[serde(rename = "loadavg")]
41 pub load_average: [f32; 2],
42}
43
44impl Default for ApiStatus {
45 fn default() -> Self {
46 Self {
47 uptime: Duration::default(),
48 commit: String::default(),
49 db_version: u32::default(),
50 request_start_time: Utc::now(),
51 request_time_taken: Duration::default(),
52 load_average: Default::default(),
53 }
54 }
55}
56
57impl Client {
59 pub async fn fetch_api_status(&self) -> Result<ApiStatus> {
68 const API_ENDPOINT: &str = "/status";
70
71 let request = self.http.get(format!("{}{}", &self.base_url, API_ENDPOINT));
73
74 let response = get_response_text(request.send().await?).await?;
76
77 Ok(from_json_str::<ApiStatus>(response.as_str())?)
79 }
80}