use foundation_netio::PreparedRequestBuilder;
use crate::client::body::EventStream;
use crate::error::DockerError;
use crate::generated::events::{system_events_request, SystemEventsArgs};
use crate::generated::auth::{
system_auth_request, AuthConfig, AuthResponse, SystemAuthArgs,
};
type NoMod = fn(&mut PreparedRequestBuilder);
pub async fn system_info(client: &super::DockerClient) -> Result<serde_json::Value, DockerError> {
use crate::error::DockerError;
use foundation_netio::shared::client::body_reader::collect_bytes_from_send_safe;
let base = client.api_url().await?;
let endpoint_url = format!("{base}/info");
let builder = foundation_netio::PreparedRequestBuilder::get(&endpoint_url)
.map_err(|e| crate::generated::shared::ApiError::RequestBuildFailed(e.to_string()))?;
let response = client.http().send_async(builder.build()).await
.map_err(|e| crate::generated::shared::ApiError::RequestSendFailed(e.to_string()))?;
let status: usize = response.get_status().into();
if status < 200 || status >= 300 {
return Err(DockerError::Api { status: status as u16, message: "(no body)".into() });
}
let body_bytes = collect_bytes_from_send_safe(response.take_body());
serde_json::from_slice(&body_bytes).map_err(|e| DockerError::JsonParse(e.to_string()))
}
pub async fn system_ping(client: &super::DockerClient) -> Result<(), DockerError> {
let base = client.api_url().await?;
let endpoint_url = format!("{base}/_ping");
let builder = PreparedRequestBuilder::get(&endpoint_url)
.map_err(|e| DockerError::Transport(e.to_string()))?;
let response = client
.http()
.send_async(builder.build())
.await
.map_err(|e| DockerError::Transport(e.to_string()))?;
let status: usize = response.get_status().into();
if status < 200 || status >= 300 {
return Err(DockerError::Api {
status: status as u16,
message: format!("system_ping failed with status {status}"),
});
}
Ok(())
}
pub async fn system_events(
client: &super::DockerClient,
since: Option<&str>,
until: Option<&str>,
filters: Option<&str>,
) -> Result<EventStream, DockerError> {
let args = SystemEventsArgs {
since: since.map(str::to_string),
until: until.map(str::to_string),
filters: filters.map(str::to_string),
};
let response =
system_events_request(client.api(), &args, &client.api_url().await?, None::<NoMod>).await?;
Ok(EventStream::new(response.body))
}
pub async fn system_data_usage(
client: &super::DockerClient,
types: Option<&str>,
) -> Result<serde_json::Value, DockerError> {
let base = client.api_url().await?;
let endpoint_url = format!("{base}/system/df");
let mut builder = PreparedRequestBuilder::get(&endpoint_url)
.map_err(|e| DockerError::Transport(e.to_string()))?;
builder = builder.query("type", types);
let response = client
.http()
.send_async(builder.build())
.await
.map_err(|e| DockerError::Transport(e.to_string()))?;
let status: usize = response.get_status().into();
if status < 200 || status >= 300 {
return Err(DockerError::Api {
status: status as u16,
message: format!("system_data_usage failed with status {status}"),
});
}
let body_bytes =
foundation_netio::shared::client::body_reader::collect_bytes_from_send_safe(
response.take_body(),
);
let parsed: serde_json::Value = serde_json::from_slice(&body_bytes)
.map_err(|e| DockerError::JsonParse(format!("system_data_usage: {e}")))?;
Ok(parsed)
}
pub async fn system_auth(
client: &super::DockerClient,
username: &str,
password: &str,
) -> Result<AuthResponse, DockerError> {
let args = SystemAuthArgs {
body: AuthConfig {
username: Some(username.to_string()),
password: Some(password.to_string()),
serveraddress: None,
},
};
let response = system_auth_request(client.api(), &args, &client.api_url().await?, None::<NoMod>).await?;
Ok(response.body)
}