use crate::{models, Value};
use containers_api::opts::{Filter, FilterItem};
use containers_api::{
impl_field, impl_filter_func, impl_map_field, impl_opts_builder, impl_str_field, impl_vec_field,
};
impl_opts_builder!(json =>
NetworkCreate
);
impl NetworkCreateOptsBuilder {
impl_str_field!(
created => "created"
);
impl_field!(
dns_enabled: bool => "dns_enabled"
);
impl_str_field!(
driver => "driver"
);
impl_str_field!(
id => "id"
);
impl_field!(
internal: bool => "internal"
);
impl_map_field!(json
ipam_options => "ipam_options"
);
impl_field!(
ipv6_enabled: bool => "ipv6_enabled"
);
impl_map_field!(json
labels => "labels"
);
impl_str_field!(
name => "name"
);
impl_str_field!(
network_interface => "network_interface"
);
impl_map_field!(json
options => "options"
);
impl_vec_field!(
subnets: models::Subnet => "subnets"
);
}
#[derive(Debug)]
pub enum NetworkListFilter {
Name(String),
Id(crate::Id),
Driver(String),
LabelKey(String),
LabelKeyVal(String, String),
NoLabelKey(String),
NoLabelKeyVal(String, String),
Until(String),
}
impl Filter for NetworkListFilter {
fn query_item(&self) -> FilterItem {
use NetworkListFilter::*;
match &self {
Name(name) => FilterItem::new("name", name.clone()),
Id(id) => FilterItem::new("id", id.to_string()),
Driver(driver) => FilterItem::new("driver", driver.clone()),
LabelKey(key) => FilterItem::new("label", key.clone()),
LabelKeyVal(key, val) => FilterItem::new("label", format!("{key}={val}")),
NoLabelKey(key) => FilterItem::new("label!", key.clone()),
NoLabelKeyVal(key, val) => FilterItem::new("label!", format!("{key}={val}")),
Until(until) => FilterItem::new("until", until.clone()),
}
}
}
impl_opts_builder!(url =>
NetworkList
);
impl NetworkListOptsBuilder {
impl_filter_func!(NetworkListFilter);
}
#[derive(Debug)]
pub enum NetworkPruneFilter {
LabelKey(String),
LabelKeyVal(String, String),
NoLabelKey(String),
NoLabelKeyVal(String, String),
Until(String),
}
impl Filter for NetworkPruneFilter {
fn query_item(&self) -> FilterItem {
use NetworkPruneFilter::*;
match &self {
LabelKey(key) => FilterItem::new("label", key.clone()),
LabelKeyVal(key, val) => FilterItem::new("label", format!("{key}={val}")),
NoLabelKey(key) => FilterItem::new("label!", key.clone()),
NoLabelKeyVal(key, val) => FilterItem::new("label!", format!("{key}={val}")),
Until(until) => FilterItem::new("until", until.clone()),
}
}
}
impl_opts_builder!(url =>
NetworkPrune
);
impl NetworkPruneOptsBuilder {
impl_filter_func!(NetworkPruneFilter);
}
impl_opts_builder!(json =>
NetworkDisconnect
);
impl NetworkDisconnectOptsBuilder {
impl_str_field!(
container => "Container"
);
impl_field!(
force: bool => "Force"
);
}
impl_opts_builder!(json =>
NetworkConnect
);
impl NetworkConnectOptsBuilder {
impl_vec_field!(
aliases => "aliases"
);
impl_str_field!(
container => "container"
);
impl_str_field!(
interface_name => "interface_name"
);
pub fn static_ips<I>(mut self, ips: impl IntoIterator<Item = I>) -> Self
where
I: IntoIterator<Item = u8>,
{
let ips: Vec<Vec<_>> = ips.into_iter().map(|a| a.into_iter().collect()).collect();
self.params.insert("static_ips", serde_json::json!(ips));
self
}
pub fn static_mac(mut self, mac: impl IntoIterator<Item = u8>) -> Self {
let mac: Vec<_> = mac.into_iter().collect();
self.params.insert("static_mac", serde_json::json!(mac));
self
}
}
impl NetworkConnectOpts {
pub(crate) fn for_container(&self, container: &crate::Id) -> Self {
let mut new = self.clone();
new.params
.insert("container", Value::String(container.to_string()));
new
}
}