use foundation_netio::shared::client::body_reader::collect_bytes_from_send_safe;
use foundation_netio::shared::http::SimpleHeader;
use foundation_netio::PreparedRequestBuilder;
use crate::error::DockerError;
use crate::generated::connect::{network_connect_request, NetworkConnectArgs};
use crate::generated::create::{network_create_request, NetworkCreateArgs, NetworkCreateResponse};
use crate::generated::disconnect::{network_disconnect_request, NetworkDisconnectArgs};
use crate::generated::networks::{
network_delete_request, network_list_request, Network, NetworkDeleteArgs, NetworkListArgs,
};
use crate::generated::shared::ApiError;
use crate::generated::prune::{network_prune_request, NetworkPruneArgs};
use super::{DockerClient, NoMod};
impl DockerClient {
pub async fn network_list(&self, filters: Option<&str>) -> Result<serde_json::Value, DockerError> {
let args = NetworkListArgs {
filters: filters.map(str::to_string),
};
let response = network_list_request(self.http(), &args, &self.base_url(), None::<NoMod>).await?;
Ok(response.body)
}
pub async fn network_inspect(
&self,
id: &str,
verbose: Option<bool>,
scope: Option<&str>,
) -> Result<Network, DockerError> {
let endpoint_url = format!("{}/networks/{id}", self.base_url());
let mut builder = PreparedRequestBuilder::get(&endpoint_url)
.map_err(|e| ApiError::RequestBuildFailed(e.to_string()))?;
builder = builder.query("verbose", verbose.map(|v| v.to_string()).as_deref());
builder = builder.query("scope", scope);
let response = self
.http()
.send_async(builder.build())
.await
.map_err(|e| ApiError::RequestSendFailed(e.to_string()))?;
let status: usize = response.get_status().into();
let headers = response.get_headers_ref().clone();
if !(200..300).contains(&status) {
return Err(ApiError::HttpStatus {
code: status as u16,
headers,
body: None,
}
.into());
}
let body = collect_bytes_from_send_safe(response.take_body());
serde_json::from_slice(&body).map_err(|e| {
DockerError::JsonParse(format!("network_inspect: decode Network: {e}"))
})
}
pub async fn network_delete(&self, id: &str) -> Result<(), DockerError> {
let args = NetworkDeleteArgs {
id: id.to_string(),
};
network_delete_request(self.http(), &args, &self.base_url(), None::<NoMod>).await?;
Ok(())
}
pub async fn network_create(
&self,
config: serde_json::Value,
) -> Result<NetworkCreateResponse, DockerError> {
let args = NetworkCreateArgs::default();
let response = network_create_request(
self.http(),
&args,
&self.base_url(),
Some(move |b: &mut PreparedRequestBuilder| {
b.set_header(SimpleHeader::CONTENT_TYPE, "application/json");
let _ = b.set_body_json(&config);
}),
)
.await?;
Ok(response.body)
}
pub async fn network_connect(
&self,
id: &str,
container_id: &str,
aliases: &[&str],
) -> Result<(), DockerError> {
let args = NetworkConnectArgs {
id: id.to_string(),
body: Default::default(),
};
let mut body = serde_json::json!({"Container": container_id});
if !aliases.is_empty() {
body["EndpointConfig"] = serde_json::json!({ "Aliases": aliases });
}
network_connect_request(
self.http(),
&args,
&self.base_url(),
Some(move |b: &mut PreparedRequestBuilder| {
b.set_header(SimpleHeader::CONTENT_TYPE, "application/json");
let _ = b.set_body_json(&body);
}),
)
.await?;
Ok(())
}
pub async fn network_disconnect(
&self,
id: &str,
container_id: &str,
force: bool,
) -> Result<(), DockerError> {
let args = NetworkDisconnectArgs {
id: id.to_string(),
body: Default::default(),
};
let body = serde_json::json!({"Container": container_id, "Force": force});
network_disconnect_request(
self.http(),
&args,
&self.base_url(),
Some(move |b: &mut PreparedRequestBuilder| {
b.set_header(SimpleHeader::CONTENT_TYPE, "application/json");
let _ = b.set_body_json(&body);
}),
)
.await?;
Ok(())
}
pub async fn network_prune(&self, filters: Option<&str>) -> Result<(), DockerError> {
let args = NetworkPruneArgs {
filters: filters.map(str::to_string),
};
network_prune_request(self.http(), &args, &self.base_url(), None::<NoMod>).await?;
Ok(())
}
}