use serde::Deserialize;
use serde::de::DeserializeOwned;
use crate::client::transport::Request;
use crate::client::{Client, ServerInfo, Support};
use crate::error::Result;
use crate::model::system::{
AdminNotifies, ApiVersionInfo, LastModified, Status, V3Status, V3Version, VerifyAuth,
};
#[derive(Debug, Clone)]
pub struct Server {
client: Client,
}
#[derive(Deserialize)]
struct MessageEnvelope<T> {
message: T,
}
impl Server {
pub(crate) const fn new(client: Client) -> Self {
Self { client }
}
async fn get<T: DeserializeOwned>(&self, path: &'static str) -> Result<T> {
self.client
.inner
.execute(Request::get(path, path))
.await?
.json()
}
pub async fn info(&self) -> Result<ServerInfo> {
self.client.server_info().await
}
pub async fn status(&self) -> Result<Status> {
self.get("api/v1/status.json").await
}
pub async fn versions(&self) -> Result<Vec<ApiVersionInfo>> {
self.client
.inner
.execute(Request::get("api/versions", "api/versions").anonymous())
.await?
.json()
}
pub async fn v3_version(&self) -> Result<V3Version> {
self.client
.inner
.execute(Request::get("api/v3/version", "api/v3/version").anonymous())
.await?
.v3()
}
pub async fn v3_status(&self) -> Result<V3Status> {
self.client
.inner
.pick_api(Support::V3Only, "API v3 status")
.await?;
self.client
.inner
.execute(Request::get("api/v3/status", "api/v3/status"))
.await?
.v3()
}
pub async fn last_modified(&self) -> Result<LastModified> {
self.client
.inner
.pick_api(Support::V3Only, "lastModified")
.await?;
self.client
.inner
.execute(Request::get("api/v3/lastModified", "api/v3/lastModified"))
.await?
.v3()
}
pub async fn verify_auth(&self) -> Result<VerifyAuth> {
let env: MessageEnvelope<VerifyAuth> = self.get("api/v1/verifyauth").await?;
Ok(env.message)
}
pub async fn admin_notifies(&self) -> Result<AdminNotifies> {
let env: MessageEnvelope<AdminNotifies> = self.get("api/v1/adminnotifies").await?;
Ok(env.message)
}
}