use bytes::Bytes;
use http::request::Builder;
use http_body_util::Full;
use hyper::Method;
use serde_derive::{Deserialize, Serialize};
use std::cmp::Eq;
use std::collections::HashMap;
use std::hash::Hash;
use super::Docker;
use crate::docker::BodyType;
use crate::errors::Error;
use crate::models::*;
#[derive(Debug, Clone, Default, PartialEq, Serialize)]
pub struct ListVolumesOptions<T>
where
T: Into<String> + Eq + Hash + serde::ser::Serialize,
{
#[serde(serialize_with = "crate::docker::serialize_as_json")]
pub filters: HashMap<T, Vec<T>>,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct CreateVolumeOptions<T>
where
T: Into<String> + Eq + Hash + serde::ser::Serialize,
{
pub name: T,
pub driver: T,
pub driver_opts: HashMap<T, T>,
pub labels: HashMap<T, T>,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct RemoveVolumeOptions {
pub force: bool,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize)]
pub struct PruneVolumesOptions<T>
where
T: Into<String> + Eq + Hash + serde::ser::Serialize,
{
#[serde(serialize_with = "crate::docker::serialize_as_json")]
pub filters: HashMap<T, Vec<T>>,
}
impl Docker {
pub async fn list_volumes<T>(
&self,
options: Option<ListVolumesOptions<T>>,
) -> Result<VolumeListResponse, Error>
where
T: Into<String> + Eq + Hash + serde::ser::Serialize,
{
let url = "/volumes";
let req = self.build_request(
url,
Builder::new().method(Method::GET),
options,
Ok(BodyType::Left(Full::new(Bytes::new()))),
);
self.process_into_value(req).await
}
pub async fn create_volume<T>(&self, config: CreateVolumeOptions<T>) -> Result<Volume, Error>
where
T: Into<String> + Eq + Hash + serde::ser::Serialize,
{
let url = "/volumes/create";
let req = self.build_request(
url,
Builder::new().method(Method::POST),
None::<String>,
Docker::serialize_payload(Some(config)),
);
self.process_into_value(req).await
}
pub async fn inspect_volume(&self, volume_name: &str) -> Result<Volume, Error> {
let url = format!("/volumes/{volume_name}");
let req = self.build_request(
&url,
Builder::new().method(Method::GET),
None::<String>,
Ok(BodyType::Left(Full::new(Bytes::new()))),
);
self.process_into_value(req).await
}
pub async fn remove_volume(
&self,
volume_name: &str,
options: Option<RemoveVolumeOptions>,
) -> Result<(), Error> {
let url = format!("/volumes/{volume_name}");
let req = self.build_request(
&url,
Builder::new().method(Method::DELETE),
options,
Ok(BodyType::Left(Full::new(Bytes::new()))),
);
self.process_into_unit(req).await
}
pub async fn prune_volumes<T>(
&self,
options: Option<PruneVolumesOptions<T>>,
) -> Result<VolumePruneResponse, Error>
where
T: Into<String> + Eq + Hash + serde::ser::Serialize,
{
let url = "/volumes/prune";
let req = self.build_request(
url,
Builder::new().method(Method::POST),
options,
Ok(BodyType::Left(Full::new(Bytes::new()))),
);
self.process_into_value(req).await
}
}