use crate::client::RestClient;
use crate::error::Result;
use serde::{Deserialize, Serialize};
use serde_json::Value;
use typed_builder::TypedBuilder;
#[derive(Debug, Clone, Serialize, Deserialize, TypedBuilder)]
pub struct DiagnosticRequest {
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub checks: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub node_uids: Option<Vec<u32>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub bdb_uids: Option<Vec<u32>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DiagnosticResult {
pub check_name: String,
pub status: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub message: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub details: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub recommendations: Option<Vec<String>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DiagnosticReport {
pub report_id: String,
pub timestamp: String,
pub results: Vec<DiagnosticResult>,
#[serde(skip_serializing_if = "Option::is_none")]
pub summary: Option<DiagnosticSummary>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DiagnosticSummary {
pub total_checks: u32,
pub passed: u32,
pub warnings: u32,
pub failures: u32,
}
pub struct DiagnosticsHandler {
client: RestClient,
}
impl DiagnosticsHandler {
pub fn new(client: RestClient) -> Self {
DiagnosticsHandler { client }
}
pub async fn run(&self, request: DiagnosticRequest) -> Result<DiagnosticReport> {
self.client.post("/v1/diagnostics", &request).await
}
pub async fn list_checks(&self) -> Result<Vec<String>> {
self.client.get("/v1/diagnostics/checks").await
}
pub async fn get_last_report(&self) -> Result<DiagnosticReport> {
self.client.get("/v1/diagnostics/last").await
}
pub async fn get_report(&self, report_id: &str) -> Result<DiagnosticReport> {
self.client
.get(&format!("/v1/diagnostics/reports/{}", report_id))
.await
}
pub async fn list_reports(&self) -> Result<Vec<DiagnosticReport>> {
self.client.get("/v1/diagnostics/reports").await
}
pub async fn get_config(&self) -> Result<Value> {
self.client.get("/v1/diagnostics").await
}
pub async fn update_config(&self, body: Value) -> Result<Value> {
self.client.put("/v1/diagnostics", &body).await
}
}