use bytes::Bytes;
use futures_core::Stream;
use http::request::Builder;
use http_body_util::Full;
use hyper::Method;
use serde_derive::{Deserialize, Serialize};
use serde_json::value::Value;
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, Deserialize)]
#[allow(missing_docs)]
pub struct Version {
#[serde(rename = "Platform")]
#[serde(skip_serializing_if = "Option::is_none")]
pub platform: Option<SystemVersionPlatform>,
#[serde(rename = "Components")]
#[serde(skip_serializing_if = "Option::is_none")]
pub components: Option<Vec<VersionComponents>>,
#[serde(rename = "Version")]
#[serde(skip_serializing_if = "Option::is_none")]
pub version: Option<String>,
#[serde(rename = "ApiVersion")]
#[serde(skip_serializing_if = "Option::is_none")]
pub api_version: Option<String>,
#[serde(rename = "MinAPIVersion")]
#[serde(skip_serializing_if = "Option::is_none")]
pub min_api_version: Option<String>,
#[serde(rename = "GitCommit")]
#[serde(skip_serializing_if = "Option::is_none")]
pub git_commit: Option<String>,
#[serde(rename = "GoVersion")]
#[serde(skip_serializing_if = "Option::is_none")]
pub go_version: Option<String>,
#[serde(rename = "Os")]
#[serde(skip_serializing_if = "Option::is_none")]
pub os: Option<String>,
#[serde(rename = "Arch")]
#[serde(skip_serializing_if = "Option::is_none")]
pub arch: Option<String>,
#[serde(rename = "KernelVersion")]
#[serde(skip_serializing_if = "Option::is_none")]
pub kernel_version: Option<String>,
#[serde(rename = "Experimental")]
#[serde(skip_serializing_if = "Option::is_none")]
#[cfg(windows)]
pub experimental: Option<bool>,
#[cfg(not(windows))]
pub experimental: Option<String>,
#[serde(rename = "BuildTime")]
#[serde(skip_serializing_if = "Option::is_none")]
pub build_time: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[allow(missing_docs)]
pub struct VersionComponents {
#[serde(rename = "Name")]
pub name: String,
#[serde(rename = "Version")]
pub version: String,
#[serde(rename = "Details")]
#[serde(skip_serializing_if = "Option::is_none")]
pub details: Option<HashMap<String, Value>>,
}
#[derive(Debug, Default, Clone, PartialEq, Serialize)]
pub struct EventsOptions<T>
where
T: Into<String> + Eq + Hash + serde::ser::Serialize,
{
#[cfg(all(feature = "chrono", not(feature = "time")))]
#[serde(serialize_with = "crate::docker::serialize_as_timestamp")]
pub since: Option<chrono::DateTime<chrono::Utc>>,
#[cfg(all(feature = "chrono", not(feature = "time")))]
#[serde(serialize_with = "crate::docker::serialize_as_timestamp")]
pub until: Option<chrono::DateTime<chrono::Utc>>,
#[cfg(feature = "time")]
#[serde(serialize_with = "crate::docker::serialize_as_timestamp")]
pub since: Option<time::OffsetDateTime>,
#[cfg(feature = "time")]
#[serde(serialize_with = "crate::docker::serialize_as_timestamp")]
pub until: Option<time::OffsetDateTime>,
#[cfg(not(any(feature = "time", feature = "chrono")))]
pub since: Option<String>,
#[cfg(not(any(feature = "time", feature = "chrono")))]
pub until: Option<String>,
#[serde(serialize_with = "crate::docker::serialize_as_json")]
pub filters: HashMap<T, Vec<T>>,
}
impl Docker {
pub async fn version(&self) -> Result<Version, Error> {
let req = self.build_request(
"/version",
Builder::new().method(Method::GET),
None::<String>,
Ok(BodyType::Left(Full::new(Bytes::new()))),
);
self.process_into_value(req).await
}
pub async fn info(&self) -> Result<SystemInfo, Error> {
let req = self.build_request(
"/info",
Builder::new().method(Method::GET),
None::<String>,
Ok(BodyType::Left(Full::new(Bytes::new()))),
);
self.process_into_value(req).await
}
pub async fn ping(&self) -> Result<String, Error> {
let url = "/_ping";
let req = self.build_request(
url,
Builder::new().method(Method::GET),
None::<String>,
Ok(BodyType::Left(Full::new(Bytes::new()))),
);
self.process_into_string(req).await
}
pub fn events<T>(
&self,
options: Option<EventsOptions<T>>,
) -> impl Stream<Item = Result<EventMessage, Error>>
where
T: Into<String> + Eq + Hash + serde::ser::Serialize,
{
let url = "/events";
let req = self.build_request(
url,
Builder::new().method(Method::GET),
options,
Ok(BodyType::Left(Full::new(Bytes::new()))),
);
self.process_into_stream(req)
}
pub async fn df(&self) -> Result<SystemDataUsageResponse, Error> {
let url = "/system/df";
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
}
}