use std::net::Ipv4Addr;
use std::ops::Not;
use indexmap::IndexMap;
use serde::Serialize;
#[derive(Debug, Clone, Default, Serialize)]
pub(crate) struct Network {
#[serde(skip_serializing_if = "Not::not")]
pub(crate) external: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) enable_ipv4: Option<bool>,
#[serde(skip_serializing_if = "Not::not")]
pub(crate) enable_ipv6: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) ipam: Option<Ipam>,
#[serde(skip_serializing_if = "Not::not")]
pub(crate) internal: bool,
#[serde(skip_serializing_if = "IndexMap::is_empty")]
pub(crate) labels: IndexMap<String, String>,
}
#[derive(Debug, Clone, Serialize)]
pub(crate) struct Ipam {
pub(crate) config: Vec<Block>,
}
#[derive(Debug, Clone, Serialize)]
pub(crate) struct Block {
pub(crate) subnet: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) gateway: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) ip_range: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize)]
pub(crate) struct Attachment {
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) ipv4_address: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) ipv6_address: Option<String>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub(crate) aliases: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) mac_address: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) interface_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) priority: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) gw_priority: Option<u32>,
}
impl Attachment {
pub(crate) fn at(address: Ipv4Addr) -> Attachment {
Attachment {
ipv4_address: Some(address.to_string()),
..Attachment::default()
}
}
pub(crate) fn with_mac(mac: impl Into<String>) -> Attachment {
Attachment {
mac_address: Some(mac.into()),
..Attachment::default()
}
}
}