use std::{collections::BTreeMap, fmt};
use anyhow::Context as _;
use scion_proto::address::IsdAsn;
use scion_sdk_address_manager::manager::AddressManager;
use serde::{Deserialize, Serialize};
use utoipa::ToSchema;
use crate::dto::DataPlaneStateDto;
#[derive(Debug, Default, PartialEq, Clone)]
pub struct DataPlaneState {
pub address_registries: BTreeMap<IsdAsn, AddressManager>,
}
impl From<&DataPlaneState> for DataPlaneStateDto {
fn from(value: &DataPlaneState) -> Self {
DataPlaneStateDto {
address_registries: value
.address_registries
.values()
.map(|registry| registry.into())
.collect(),
}
}
}
impl TryFrom<DataPlaneStateDto> for DataPlaneState {
type Error = anyhow::Error;
fn try_from(state: DataPlaneStateDto) -> Result<Self, Self::Error> {
let registries = state
.address_registries
.into_iter()
.map(|mngr| {
let addr_mngr: AddressManager = mngr
.try_into()
.context("Failed to convert manager to AddressManager")?;
Ok((addr_mngr.isd_asn(), addr_mngr))
})
.collect::<Result<BTreeMap<_, _>, Self::Error>>()?;
Ok(Self {
address_registries: registries,
})
}
}
pub trait Id {
fn from_usize(val: usize) -> Self;
fn as_usize(&self) -> usize;
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, ToSchema, Serialize, Deserialize)]
#[serde(transparent)]
pub struct DataPlaneId(usize);
impl Id for DataPlaneId {
fn as_usize(&self) -> usize {
self.0
}
fn from_usize(val: usize) -> Self {
Self(val)
}
}
impl fmt::Display for DataPlaneId {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.0)
}
}