1use crate::client::RestClient;
9use crate::error::Result;
10use serde::{Deserialize, Serialize};
11use serde_json::Value;
12
13#[derive(Debug, Clone, Serialize, Deserialize)]
15pub struct LogEntry {
16 pub time: String,
18
19 #[serde(rename = "type")]
22 pub event_type: String,
23
24 #[serde(flatten)]
27 pub extra: Value,
28}
29
30#[derive(Debug, Serialize, Default)]
32pub struct LogsQuery {
33 #[serde(skip_serializing_if = "Option::is_none")]
35 pub stime: Option<String>,
36 #[serde(skip_serializing_if = "Option::is_none")]
38 pub etime: Option<String>,
39 #[serde(skip_serializing_if = "Option::is_none")]
41 pub order: Option<String>,
42 #[serde(skip_serializing_if = "Option::is_none")]
44 pub limit: Option<u32>,
45 #[serde(skip_serializing_if = "Option::is_none")]
47 pub offset: Option<u32>,
48}
49
50pub struct LogsHandler {
52 client: RestClient,
53}
54
55impl LogsHandler {
56 pub fn new(client: RestClient) -> Self {
57 LogsHandler { client }
58 }
59
60 pub async fn list(&self, query: Option<LogsQuery>) -> Result<Vec<LogEntry>> {
62 if let Some(q) = query {
63 let query_str = serde_urlencoded::to_string(&q).unwrap_or_default();
65 self.client.get(&format!("/v1/logs?{}", query_str)).await
66 } else {
67 self.client.get("/v1/logs").await
68 }
69 }
70}