use reqwest::{Method, StatusCode};
use serde::{Deserialize, Serialize};
use crate::{Client, Result, response::Empty};
#[derive(Debug)]
pub struct Sys<'a, State> {
client: &'a Client<State>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct Health {
pub initialized: bool,
pub sealed: bool,
#[serde(default)]
pub standby: bool,
pub version: String,
#[serde(default)]
pub cluster_name: Option<String>,
#[serde(default)]
pub cluster_id: Option<String>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct SealStatus {
#[serde(rename = "type")]
pub seal_type: String,
pub initialized: bool,
pub sealed: bool,
#[serde(default)]
pub n: Option<u64>,
#[serde(default)]
pub t: Option<u64>,
#[serde(default)]
pub progress: Option<u64>,
pub version: String,
}
impl<State> Client<State> {
pub fn sys(&self) -> Sys<'_, State> {
Sys { client: self }
}
}
impl<State> Sys<'_, State> {
pub async fn health(&self) -> Result<Health> {
self.client
.request_json_accepting(
Method::GET,
"sys/health",
Option::<&Empty>::None,
&[
StatusCode::OK,
StatusCode::NO_CONTENT,
StatusCode::TOO_MANY_REQUESTS,
StatusCode::NOT_IMPLEMENTED,
StatusCode::SERVICE_UNAVAILABLE,
openbao_status(472)?,
openbao_status(473)?,
],
)
.await
}
pub async fn seal_status(&self) -> Result<SealStatus> {
self.client
.request_json(Method::GET, "sys/seal-status", Option::<&Empty>::None)
.await
}
}
fn openbao_status(code: u16) -> Result<StatusCode> {
StatusCode::from_u16(code)
.map_err(|_| crate::Error::Internal("invalid OpenBao health status code"))
}