use std::collections::HashMap;
use ipnetwork::IpNetwork;
use semver::Version;
use serde::{Deserialize, Serialize};
use serde_json::Value;
use crate::{ip_range::IpRange, macaddr::MacAddr};
pub use crate::dns::Dns;
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct NetworkConfig {
#[serde(deserialize_with = "crate::version::deserialize_version")]
#[serde(serialize_with = "crate::version::serialize_version")]
pub cni_version: Version,
pub name: String,
#[serde(rename = "type")]
pub plugin: String,
#[serde(default, skip_serializing_if = "HashMap::is_empty")]
pub args: HashMap<String, Value>,
#[serde(default)]
pub ip_masq: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub ipam: Option<IpamConfig>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub dns: Option<Dns>,
#[serde(
default,
rename = "runtimeConfig",
skip_serializing_if = "Option::is_none"
)]
pub runtime: Option<RuntimeConfig>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub prev_result: Option<Value>,
#[serde(flatten)]
pub specific: HashMap<String, Value>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct IpamConfig {
#[serde(rename = "type")]
pub plugin: String,
#[serde(flatten)]
pub specific: HashMap<String, Value>,
}
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct RuntimeConfig {
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub port_mappings: Vec<PortMapping>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub ips_ranges: Vec<Vec<IpRange>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub bandwidth: Option<BandwidthLimits>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub dns: Option<Dns>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub ips: Vec<IpNetwork>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub mac: Option<MacAddr>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub aliases: Vec<String>,
#[serde(flatten)]
pub specific: HashMap<String, Value>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct PortMapping {
pub host_port: u16,
pub container_port: u16,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub protocol: Option<PortProtocol>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub enum PortProtocol {
Tcp,
Udp,
}
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct BandwidthLimits {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub ingress_rate: Option<usize>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub ingress_burst: Option<usize>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub egress_rate: Option<usize>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub egress_burst: Option<usize>,
}