harborshield 0.1.0

A Rust port of Whalewall, to automate management of firewall rules for Docker containers
use bon::Builder;
use serde::{Deserialize, Serialize};
use std::net::IpAddr;

#[derive(Debug, Clone, Serialize, Deserialize, Builder)]
pub struct ContainerIdentifiers {
    pub id: String,
    pub name: String,
}

#[derive(Debug, Clone, Serialize, Deserialize, Builder)]
pub struct Addr {
    pub addr: Vec<u8>,
    pub container_id: String,
}

impl Addr {
    pub fn from_ip(ip: IpAddr, container_id: String) -> Self {
        let addr = match ip {
            IpAddr::V4(v4) => v4.octets().to_vec(),
            IpAddr::V6(v6) => v6.octets().to_vec(),
        };
        Self { addr, container_id }
    }

    pub fn to_ip(&self) -> Option<IpAddr> {
        match self.addr.len() {
            4 => {
                let mut octets = [0u8; 4];
                octets.copy_from_slice(&self.addr);
                Some(IpAddr::V4(octets.into()))
            }
            16 => {
                let mut octets = [0u8; 16];
                octets.copy_from_slice(&self.addr);
                Some(IpAddr::V6(octets.into()))
            }
            _ => None,
        }
    }
}

#[derive(Debug, Clone, Serialize, Deserialize, Builder)]
pub struct ContainerAlias {
    pub container_id: String,
    pub container_alias: String,
}

#[derive(Debug, Clone, Serialize, Deserialize, Builder)]
pub struct EstContainer {
    pub src_container_id: String,
    pub dst_container_id: String,
}

#[derive(Debug, Clone, Serialize, Deserialize, Builder)]
pub struct WaitingContainerRule {
    pub src_container_id: String,
    pub dst_container_name: String,
    pub rule: Vec<u8>,
}