use foundation_netio::PreparedRequestBuilder;
use crate::error::DockerError;
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.base_url();
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.base_url();
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<Vec<u8>, DockerError> {
let base = client.base_url();
let endpoint_url = format!("{base}/events");
let mut builder = PreparedRequestBuilder::get(&endpoint_url)
.map_err(|e| DockerError::Transport(e.to_string()))?;
builder = builder.query("since", since);
builder = builder.query("until", until);
builder = builder.query("filters", filters);
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_events failed with status {status}"),
});
}
let body_bytes =
foundation_netio::shared::client::body_reader::collect_bytes_from_send_safe(
response.take_body(),
);
Ok(body_bytes)
}
pub async fn system_data_usage(
client: &super::DockerClient,
types: Option<&str>,
) -> Result<serde_json::Value, DockerError> {
let base = client.base_url();
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.http(), &args, &client.base_url(), None::<NoMod>).await?;
Ok(response.body)
}