use crate::types::Error;
use crate::types::ObjectVisibility;
use serde::{Serialize, Deserialize};
pub type RawIpv4Addr = [u8; 4];
pub fn ipv4_subnet_mask(prefix_len: u8) -> RawIpv4Addr {
let mut mask = 0xffffffffu32;
mask = mask.checked_shr(prefix_len as u32).unwrap_or(0);
mask = !mask;
let mask = mask.to_be_bytes();
mask
}
pub fn ipv4_wildcard_mask(prefix_len: u8) -> RawIpv4Addr {
let mut mask = 0xffffffffu32;
mask = mask.checked_shr(prefix_len as u32).unwrap_or(0);
let mask = mask.to_be_bytes();
mask
}
pub fn ipv4_network_address(ip: RawIpv4Addr, prefix_len: u8) -> RawIpv4Addr {
let mask = ipv4_subnet_mask(prefix_len);
let mut addr = [0; 4];
for i in 0..4 {
addr[i] = ip[i] & mask[i];
}
addr
}
pub fn ipv4_broadcast_address(ip: RawIpv4Addr, prefix_len: u8) -> RawIpv4Addr {
let wildcard = ipv4_wildcard_mask(prefix_len);
let mut addr = [0; 4];
for i in 0..4 {
addr[i] = ip[i] | wildcard[i];
}
addr
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AssignmentSpaceIpv4 {
#[serde(default)]
pub id: i32,
pub name: String,
pub description: String,
pub space_visibility: ObjectVisibility,
pub ipv4_prefix: [u8; 4],
pub ipv4_prefix_len: i32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AssignmentPoolIpv4 {
#[serde(default)]
pub id: i32,
pub assignment_space_id: i32,
pub name: String,
pub description: String,
pub pool_visibility: ObjectVisibility,
pub ipv4_prefix: [u8; 4],
pub ipv4_prefix_len: i32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AssignmentIpv4 {
#[serde(default)]
pub id: i32,
pub assignment_pool_id: i32,
pub name: String,
pub description: String,
pub assignment_visibility: ObjectVisibility,
pub ipv4_prefix: [u8; 4],
pub ipv4_prefix_len: i32,
}
pub trait Ipv4AssignmentStore {
fn get_space(&self, space_id: i32) -> Result<AssignmentSpaceIpv4, Error>;
fn get_spaces(&self) -> Result<Vec<AssignmentSpaceIpv4>, Error>;
fn create_space(&self, space: &AssignmentSpaceIpv4) -> Result<i32, Error>;
fn update_space(&self, id: i32, name: &str, description: &str) -> Result<(), Error>;
fn delete_space(&self, space_id: i32) -> Result<(), Error>;
fn get_pool(&self, pool_id: i32) -> Result<AssignmentPoolIpv4, Error>;
fn get_pools(&self, space_id: i32) -> Result<Vec<AssignmentPoolIpv4>, Error>;
fn create_pool(&self, pool: &AssignmentPoolIpv4) -> Result<i32, Error>;
fn update_pool(&self, id: i32, name: &str, description: &str) -> Result<(), Error>;
fn delete_pool(&self, pool_id: i32) -> Result<(), Error>;
fn get_assignment(&self, assignment_id: i32) -> Result<AssignmentIpv4, Error>;
fn get_assignments(&self, pool_id: i32) -> Result<Vec<AssignmentIpv4>, Error>;
fn create_assignment(&self, assignment: &AssignmentIpv4) -> Result<i32, Error>;
fn update_assignment(&self, id: i32, name: &str, description: &str) -> Result<(), Error>;
fn delete_assignment(&self, assignment_id: i32) -> Result<(), Error>;
}