1use std::future::Future;
2
3use crate::core::error::Result;
4
5#[derive(
6 Debug,
7 Clone,
8 Copy,
9 PartialEq,
10 Eq,
11 PartialOrd,
12 Ord,
13 serde::Serialize,
14 serde::Deserialize,
15 clap::ValueEnum,
16)]
17#[serde(rename_all = "lowercase")]
18pub enum LogLevel {
19 Trace,
20 Debug,
21 Info,
22 Warning,
23 Error,
24 Critical,
25}
26
27#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
28pub struct LogLine {
29 pub timestamp: String,
30 pub level: LogLevel,
31 pub title: Option<String>,
32 pub message: String,
33}
34
35#[derive(Debug, Clone, Default)]
36pub struct LogsOptions {
37 pub lines: Option<u32>,
38 pub start: Option<String>,
39 pub end: Option<String>,
40 pub level: Option<LogLevel>,
41}
42
43pub trait LogsRead {
44 fn get_logs(
45 &self,
46 options: LogsOptions,
47 ) -> impl Future<Output = Result<Vec<LogLine>>> + Send + '_;
48}
49
50pub async fn get_logs<C: LogsRead + ?Sized>(
51 client: &C,
52 options: LogsOptions,
53) -> Result<Vec<LogLine>> {
54 client.get_logs(options).await
55}