use alloc::format;
use alloc::string::ToString;
use core::fmt::{Debug, Display, Formatter};
use serde::de::DeserializeOwned;
use serde::{Deserialize, Serialize};
use crate::communication::connection::Address;
use crate::config::SystemNodeArgs;
use crate::nodes::SystemMetadata;
pub trait SerializableMetadata: BasicMetadata + Serialize + DeserializeOwned {}
pub trait BasicMetadata: Clone + Debug + Display {}
#[derive(Default, Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub struct NoCoordinatedMetadata;
impl Display for NoCoordinatedMetadata {
fn fmt(&self, formatter: &mut Formatter<'_>) -> core::fmt::Result {
write!(formatter, "[Empty]")
}
}
impl BasicMetadata for NoCoordinatedMetadata {}
impl SerializableMetadata for NoCoordinatedMetadata {}
pub trait CommunicationMetadata: BasicMetadata {
type Addr: Address;
fn address(&self) -> Self::Addr;
}
#[derive(Serialize, Deserialize, Debug, Clone, Eq, PartialEq)]
pub struct NodeMetadata<CoordMetadata: BasicMetadata, CommMetadata: CommunicationMetadata> {
pub node: SystemMetadata<CommMetadata>,
pub coordination: Option<CoordMetadata>,
}
impl<CoordMetadata: BasicMetadata, CommMetadata: CommunicationMetadata> BasicMetadata
for NodeMetadata<CoordMetadata, CommMetadata>
{
}
impl<CoordMetadata: BasicMetadata, CommMetadata: CommunicationMetadata> Display
for NodeMetadata<CoordMetadata, CommMetadata>
{
fn fmt(&self, formatter: &mut Formatter<'_>) -> core::fmt::Result {
let coordination = self
.coordination
.clone()
.map(|coord| format!("{}", coord))
.unwrap_or_else(|| "None".to_string());
write!(
formatter,
"(Role: {:?}, Coordination: {}, Communication: {})",
self.node.role, coordination, self.node.communication
)
}
}
pub trait CoordinationMetadataBuilder<Metadata: SerializableMetadata + BasicMetadata>:
Default
{
fn build(args: &SystemNodeArgs) -> Metadata;
}
pub trait CommunicationMetadataBuilder<Metadata: CommunicationMetadata>: Default {
fn build(args: &SystemNodeArgs) -> Metadata;
}