use std::collections::BTreeMap;
use serde::{Deserialize, Serialize};
use utoipa::ToSchema;
use super::{ExternalAsInterfaceState, ExternalAsState};
use crate::util::{BtreeMapError, map_btree, map_btree_fallible};
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct ExternalAsStateDto {
pub(crate) interfaces: BTreeMap<u16, ExternalAsInterfaceDto>,
}
impl From<ExternalAsState> for ExternalAsStateDto {
fn from(value: ExternalAsState) -> Self {
ExternalAsStateDto {
interfaces: map_btree(value.interfaces, |iface_state| iface_state.into()),
}
}
}
impl TryFrom<ExternalAsStateDto> for ExternalAsState {
type Error = BtreeMapError<u16, std::net::AddrParseError>;
fn try_from(value: ExternalAsStateDto) -> Result<Self, Self::Error> {
Ok(ExternalAsState {
interfaces: map_btree_fallible(value.interfaces, |iface_state| iface_state.try_into())?,
})
}
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct ExternalAsInterfaceDto {
pub(crate) interface_id: u16,
pub(crate) target_addr: String,
}
impl From<ExternalAsInterfaceState> for ExternalAsInterfaceDto {
fn from(value: ExternalAsInterfaceState) -> Self {
ExternalAsInterfaceDto {
interface_id: value.interface_id,
target_addr: value.target_addr.to_string(),
}
}
}
impl TryFrom<ExternalAsInterfaceDto> for ExternalAsInterfaceState {
type Error = std::net::AddrParseError;
fn try_from(value: ExternalAsInterfaceDto) -> Result<Self, Self::Error> {
Ok(ExternalAsInterfaceState {
interface_id: value.interface_id,
target_addr: value.target_addr.parse()?,
})
}
}