use crate::client::UgosClient;
use crate::error::Result;
use crate::types::syslog::{LogEntry, LogPage, User};
#[derive(Debug, Default, Clone)]
pub struct LogFilter<'a> {
pub module: Option<&'a str>,
pub level: Option<&'a str>,
pub operator: Option<&'a str>,
pub keyword: Option<&'a str>,
pub page: u32,
pub size: u32,
}
#[allow(clippy::module_name_repetitions)]
pub trait SysLogApi {
fn syslog(&self, filter: &LogFilter<'_>) -> impl Future<Output = Result<LogPage>> + Send;
fn users(&self) -> impl Future<Output = Result<Vec<User>>> + Send;
fn current_user(&self) -> impl Future<Output = Result<User>> + Send;
}
#[derive(serde::Deserialize)]
struct UserList {
#[serde(default)]
list: Vec<User>,
}
impl SysLogApi for UgosClient {
async fn syslog(&self, filter: &LogFilter<'_>) -> Result<LogPage> {
let page = filter.page.max(1).to_string();
let size = if filter.size == 0 { 20 } else { filter.size }.to_string();
let mut params: Vec<(&str, &str)> = vec![("page", &page), ("size", &size)];
for (key, value) in [
("module", filter.module),
("level", filter.level),
("operator", filter.operator),
("keyword", filter.keyword),
] {
if let Some(v) = value {
params.push((key, v));
}
}
self.get_with_params("log/query", ¶ms).await
}
async fn users(&self) -> Result<Vec<User>> {
let resp: UserList = self.get("user/list").await?;
Ok(resp.list)
}
async fn current_user(&self) -> Result<User> {
self.get("user/current/user").await
}
}
impl LogPage {
#[must_use]
pub fn entries(&self) -> &[LogEntry] {
self.log_list.as_deref().unwrap_or_default()
}
}